Ich möchte 10 asynchrone HTTP-Anforderungen auf einmal und nur die Ergebnisse verarbeiten, wenn alle abgeschlossen haben und in einer einzigen Callback-Funktion. Ich möchte auch keine Threads mit WaitAll blockieren (es versteht sich, dass WaitAll blockiert, bis alle abgeschlossen sind). Ich denke, ich möchte ein benutzerdefiniertes IAsyncResult machen, das mehrere Anrufe behandelt. Bin ich auf dem richtigen Weg? Gibt es irgendwelche guten Ressourcen oder Beispiele, die den Umgang damit beschreiben?C# mehrere asynchrone HttpRequest mit einem Callback
Antwort
Ich mag Diess Lösung. Aber, wenn Sie etwas traditionelleres wollen, können Sie das versuchen.
Ich würde auf jeden Fall eine Reihe von Wartegriffen und den WaitAll Mechanismus verwenden:
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!");
}
}
Werfen Sie einen Blick auf diesen Artikel Asynchronous Calls in .NET - Polling or Waiting for Completion
Ich glaube, Sie besser dran sind die WaitAll Ansatz. Andernfalls werden Sie 10 IAsyncResult-Rückrufe verarbeiten und mithilfe eines Semaphors feststellen, dass alle 10 schließlich vollständig sind.
Beachten Sie, dass WaitAll sehr effizient ist; es ist nicht wie die Albernheit, einen Faden "schlafen" zu haben. Wenn ein Thread schläft, verbraucht er weiterhin Verarbeitungszeit. Wenn ein Thread "entplant" wird, weil er einen WaitAll-Wert erreicht hat, verbraucht der Thread keine Prozessorzeit mehr. Es ist sehr effizient.
Wird der Thread im Kontext des IIS-Thread-Pools noch verwendet oder wird er wie für einen asynchronen Aufruf in den Pool zurückgelegt? – aepheus
In .NET 4.0 gibt es eine schöne Parallele Task library, dass Sie Dinge wie tun können:
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();
}
}
Wie Sie für jede URL in der Liste eine andere Aufgabe und einmal gestartet sehen können alle Aufgaben abgeschlossen sind die Callback wird aufgerufen und das Ergebnis aller Aufgaben übergeben.
Eigentlich wird nur synchrone Aufruf in separaten Worker-Thread. Um dies zu lösen, sollten Sie 'TaskFactory.FromAsync' und' client.BeginGetResponse' verwenden. Auf diese Weise werden die E/A-Abschluss-Ports ohne Thread-Blockierung verwendet. – VirusX
- 1. Mehrere asynchrone HttpRequests in C#
- 2. Callback-Muster mit einem Functor
- 3. Mehrere asynchrone Funktionsaufrufe
- 4. Asynchrone Ereignisausführung mit Websockets
- 5. Mehrere simultane Ajax-Anfragen (mit einem Callback) in jQuery
- 6. Kotlin/anko mehrere asynchrone Aufgaben
- 7. Warten auf mehrere asynchrone POST-Anfragen
- 8. C# C++ Interop Callback
- 9. NodeJS - mehrere asynchrone HTTP-Anfragen
- 10. C# MixerOpen mit Callback-Funktion
- 11. Asynchrone RabbitMQ Consumer mit aioamqp
- 12. Mehrere asynchrone Google Maps onclick
- 13. ObjC/C/C++ hochauflösender Timer mit Callback
- 14. asynchrone Funktionsaufruf C++ 0x
- 15. Knoten Objektzuweisung in asynchrone Callback-Funktion hängen unbegrenzt
- 16. callback() oder return callback()
- 17. Asynchronous Httprequest mit WinHttp.WinHttpRequest.5.1 in ASP
- 18. Asynchrone Bildverarbeitung in C#
- 19. Wartet auf Callback für mehrere Futures
- 20. Wie werden mehrere asynchrone Tasks parallel ausgeführt?
- 21. Wie kann man die asynchrone Callback-Funktion wiederverwenden?
- 22. Gibt eine asynchrone Callback-Funktion beim Abschluss ein Ereignis aus?
- 23. C# - Asynchrone Hintergrundaufgabe mit periodischem Auslöser
- 24. Httprequest kodierend Mismatch
- 25. Eine asynchrone Methode in C#
- 26. ZeroMQ: asynchrone Antworten
- 27. Mehrere Funktionen für EventListener Callback
- 28. Wie kann ich auf asynchrone Callback-Funktionen warten?
- 29. Wie funktionieren asynchrone Methoden in C#?
- 30. senden Sie Dateidaten mit PHP HttpRequest
Was ist der Kontext dieser Operation? Innerhalb einer Webseite? – Keltex
Diese Art von Sache ist in F # fast trivial. Es könnte sich lohnen, ein Modul in F # zu schreiben, das aus C# -Code aufgerufen werden kann ... –
@Keltex es wäre Teil einer Webanwendung. – aepheus