Wie starten Sie mehrere HttpClient.GetAsync()
-Anfragen gleichzeitig und behandeln sie alle, sobald ihre jeweiligen Antworten zurückkommen? Zuerst was ich versuchte ist:Mehrere async/await-Funktionen gleichzeitig starten und separat behandeln
var response1 = await client.GetAsync("http://example.com/");
var response2 = await client.GetAsync("http://stackoverflow.com/");
HandleExample(response1);
HandleStackoverflow(response2);
Aber natürlich ist es immer noch sequentiell. Also habe ich versucht, sie beginnen beide auf einmal:
var task1 = client.GetAsync("http://example.com/");
var task2 = client.GetAsync("http://stackoverflow.com/");
HandleExample(await task1);
HandleStackoverflow(await task2);
Jetzt werden die Aufgaben sind gestartet zugleich, was gut ist, aber natürlich immer noch der Code für eine nach der anderen warten.
Was ich will, ist in der Lage, die „example.com“ Antwort so schnell zu behandeln, wie es kommt, und die „stackoverflow.com“ Antwort, sobald er kommt.
Ich konnte das setzen zwei Aufgaben in einem Array eine Task.WaitAny()
in einer Schleife, zu prüfen, welche beendet und den entsprechenden Handler aufrufen, aber dann ... wie ist das besser als nur normale alte Rückrufe? Oder ist das nicht wirklich ein beabsichtigter Anwendungsfall für async/erwarten? Wenn nicht, wie würde ich HttpClient.GetAsync()
mit Rückrufen verwenden?
Um zu klären - das Verhalten, das ich bin nach so etwas wie dieses Pseudo-Code ist:
client.GetAsyncWithCallback("http://example.com/", HandleExample);
client.GetAsyncWithCallback("http://stackoverflow.com/", HandleStackoverflow);
FWIW, da Task.WhenAll params in der Überladung verwendet, die ein Array nimmt, können Sie die letzte Zeile in nur WhenAll (task1, task2) ändern und den Compiler das Array für Sie erstellen lassen :) http://msdn.microsoft .com/de-de/library/hh194874.aspx –
Diese Antwort wartet nur auf sie beide zu vervollständigen. Es "behandelt sie nicht jedes Mal, sobald ihre jeweiligen Antworten zurückkommen". –
[Ich weiß @ StephenClearys Kommentar ist wirklich alt, aber ich wollte nicht, dass jemand anders das gleiche denkt, um verwirrt zu werden.] Diese Antwort behandelt sie jeweils in ihren "ContinueWith" -Aufrufen (deren Ergebnis sind die eigentlichen Aufgaben, die 'zugewiesen sind) task1' und 'task2'). Das erwartete 'WhenAll' stellt einfach sicher, dass beide" Handlings "-Tasks ausgeführt werden, bevor irgendwelche Zeilen darüber hinaus ausgeführt werden. – patridge