Quiero hacer 10 solicitudes http asíncronas a la vez y solo procesar los resultados cuando todos se hayan completado y en una sola función de devolución de llamada. Tampoco quiero bloquear ningún hilo usando WaitAll (tengo entendido que WaitAll bloquea hasta que todos estén completos). Creo que quiero hacer un IAsyncResult personalizado que manejará múltiples llamadas. ¿Estoy en el camino correcto? ¿Existen buenos recursos o ejemplos que describan el manejo de esto?C# HttpRequest asíncrono múltiple con una devolución de llamada
Respuesta
Me gusta la solución de Darin. Pero, si quieres algo más tradicional, puedes probar esto.
Definitivamente, utilizar una gran variedad de mangos de espera y el mecanismo WaitAll:
static void Main(string[] args)
{
WaitCallback del = state =>
{
ManualResetEvent[] resetEvents = new ManualResetEvent[10];
WebClient[] clients = new WebClient[10];
Console.WriteLine("Starting requests");
for (int index = 0; index < 10; index++)
{
resetEvents[index] = new ManualResetEvent(false);
clients[index] = new WebClient();
clients[index].OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
clients[index].OpenReadAsync(new Uri(@"http:\\www.google.com"), resetEvents[index]);
}
bool succeeded = ManualResetEvent.WaitAll(resetEvents, 10000);
Complete(succeeded);
for (int index = 0; index < 10; index++)
{
resetEvents[index].Dispose();
clients[index].Dispose();
}
};
ThreadPool.QueueUserWorkItem(del);
Console.WriteLine("Waiting...");
Console.ReadKey();
}
static void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
// Do something with data...Then close the stream
e.Result.Close();
ManualResetEvent readCompletedEvent = (ManualResetEvent)e.UserState;
readCompletedEvent.Set();
Console.WriteLine("Received callback");
}
static void Complete(bool succeeded)
{
if (succeeded)
{
Console.WriteLine("Yeah!");
}
else
{
Console.WriteLine("Boohoo!");
}
}
Tome un vistazo a este artículo Asynchronous Calls in .NET - Polling or Waiting for Completion
Creo que es mejor usar el enfoque WaitAll. De lo contrario, procesará 10 devoluciones de llamada IAsyncResult y usará un semáforo para determinar que los 10 finalmente se completaron.
Tenga en cuenta que WaitAll es muy eficiente; no es como la tontería de tener un hilo "dormido". Cuando un hilo duerme, continúa usando el tiempo de procesamiento. Cuando un hilo se "des-programa" porque golpea a un WaitAll, entonces el hilo ya no consume ningún tiempo de procesador. Es muy eficiente
En el contexto del grupo de subprocesos de IIS, ¿el subproceso aún está en uso o se volvería a colocar en el grupo de servidores como lo haría para una llamada asincrónica? – aepheus
En .NET 4.0 hay un buen paralelo Task library que le permite hacer cosas como:
using System;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
class Program
{
public static void Main()
{
var urls = new[] { "http://www.google.com", "http://www.yahoo.com" };
Task.Factory.ContinueWhenAll(
urls.Select(url => Task.Factory.StartNew(u =>
{
using (var client = new WebClient())
{
return client.DownloadString((string)u);
}
}, url)).ToArray(),
tasks =>
{
var results = tasks.Select(t => t.Result);
foreach (var html in results)
{
Console.WriteLine(html);
}
});
Console.ReadLine();
}
}
Como se puede ver por cada URL en la lista se inicia una tarea diferente y una vez que se hayan completado todas las tareas de la la devolución de llamada se invoca y pasa el resultado de todas las tareas.
En realidad, solo realizará una llamada síncrona en un subproceso independiente. Para resolver esto, debe hacer uso de 'TaskFactory.FromAsync' +' client.BeginGetResponse'. De esta forma, los puertos de finalización de E/S se usarán sin bloqueo de subprocesos. – VirusX
- 1. devolución de llamada en C#, orden de llamada y devolución
- 2. jQuery animado múltiple() de devolución de llamada
- 3. MVC controlador asíncrono ASP.NET 4 Devolución de llamada
- 4. javascript: ejecuta un montón de método asíncrono con una devolución de llamada
- 5. SWIG enlaces C++ con devolución de llamada
- 6. Devolución de llamada en C#
- 7. método de llamada asíncrono C# periódicamente
- 8. Prueba de una llamada al método asíncrono
- 9. C# C++ devolución de llamada de interoperabilidad
- 10. Devolución de llamada en C#
- 11. ¿Es posible convertir una devolución de llamada en un bloque asíncrono?
- 12. Declaración de devolución múltiple ¿EXTRAÑO?
- 13. C++: typedefs de devolución de llamada con __stdcall en MSVC
- 14. Patrón de diseño de devolución de llamada doble o múltiple con JavaScript/jQuery
- 15. carga JavaScript asíncrono, a continuación, comprobar DOM cargado antes de ejecutar devolución de llamada
- 16. múltiple servicio web asíncrono pide NSURLConnection iOS
- 17. ¿Cómo implemento una devolución de llamada en C++?
- 18. ¿Cómo escribir una función jQuery con una devolución de llamada?
- 19. Cómo realizar una devolución de llamada en Objective-C
- 20. Llamar a MiniDumpWriteDump con devolución de llamada
- 21. Prueba de código asíncrono con JUnit
- 22. ¿Cómo hago una cadena de devolución de llamada con q?
- 23. $ envío (este) en una devolución de llamada
- 24. Devolución de llamada asincrónica
- 25. Dónde definir la devolución de llamada para el método asíncrono basado en tareas
- 26. TPL Cómo realizar una 'devolución de llamada'
- 27. document.createElement ('script') ... agregar dos scripts con una devolución de llamada
- 28. ¿Hay una devolución de llamada para History.pushstate?
- 29. ¿Cómo debo PHPDoc una devolución de llamada?
- 30. devolución de llamada desde C++ al objetivo c
¿Cuál es el contexto de esta operación? Dentro de una página web? – Keltex
Este tipo de cosas es muy trivial en F #. Puede valer la pena escribir un módulo en F # que pueda invocarse desde el código C# ... –
@Keltex sería parte de una aplicación web. – aepheus