Mehrere async / await-Funktionen gleichzeitig starten und separat behandeln

7

Wie startest du mehrere HttpClient.GetAsync() -Anfragen gleichzeitig und behandelst sie, sobald ihre jeweiligen Antworten zurückkommen? Zuerst habe ich versucht:

%Vor%

Aber natürlich ist es immer noch sequenziell. Also habe ich versucht, sie beide gleichzeitig zu starten:

%Vor%

Jetzt werden die Aufgaben gleichzeitig gestartet , was gut ist, aber natürlich muss der Code immer noch nacheinander warten.

Ich möchte die Antwort "example.com" so bald wie möglich verarbeiten und die Antwort "stackoverflow.com", sobald sie eintrifft.

Ich könnte die beiden Aufgaben in ein Array setzen und in einer Schleife Task.WaitAny() verwenden, prüfen, welche beendet wurde und den entsprechenden Handler aufrufen, aber dann ... wie ist das besser als nur normale alte Callbacks? 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 verdeutlichen - das Verhalten, nach dem ich suche, ist so etwas wie dieser Pseudocode:

%Vor%     
Ben Hoyt 17.10.2012, 10:19
quelle

3 Antworten

12

Sie können ContinueWith und WhenAll verwenden, um auf ein neues Task zu warten, task1 und task2 werden parallel ausgeführt

%Vor%     
Cuong Le 17.10.2012, 10:26
quelle
5

Sie können eine Methode verwenden, die sie nach ihrer Fertigstellung neu anordnet. Dies ist ein schöner Trick, der von beschrieben wird Jon Skeet und Stephen Toub und auch von meiner AsyncEx-Bibliothek unterstützt.

Alle drei Implementierungen sind sehr ähnlich. Nehmen Sie meine eigene Implementierung:

%Vor%

Sie können es dann als solches verwenden:

%Vor%

Ein anderer Ansatz besteht darin, TPL Dataflow zu verwenden; Sobald die Aufgabe abgeschlossen ist, posten Sie ihre Operation in ActionBlock<T> , etwa so:

%Vor%

Eine der obigen Antworten wird gut funktionieren. Wenn der Rest Ihres Codes TPL Dataflow verwendet / verwenden könnte, bevorzugen Sie möglicherweise diese Lösung.

    
Stephen Cleary 17.10.2012 11:05
quelle
4

Deklarieren Sie eine asynchrone Funktion und übergeben Sie Ihren Callback in:

%Vor%

Und dann ruf einfach mehrmals an:

%Vor%     
Jan 17.10.2012 10:27
quelle