Jak rozpocząć wiele żądań od razu na jeden i zaraz po ich odpowiedziach? Najpierw próbowałem:Uruchamianie wielu funkcji async/await jednocześnie i obsługa ich osobno
var response1 = await client.GetAsync("http://example.com/");
var response2 = await client.GetAsync("http://stackoverflow.com/");
HandleExample(response1);
HandleStackoverflow(response2);
Ale oczywiście nadal jest sekwencyjny. Więc próbowałem rozpoczęciem ich obu naraz:
var task1 = client.GetAsync("http://example.com/");
var task2 = client.GetAsync("http://stackoverflow.com/");
HandleExample(await task1);
HandleStackoverflow(await task2);
Teraz zadania są rozpoczęła w tym samym czasie, co jest dobre, ale oczywiście kod wciąż musi czekać na jeden po drugim.
Co chcę jest aby móc obsłużyć odpowiedź „example.com” tak szybko, jak to jest w, a „stackoverflow.com” odpowiedź tak szybko, jak to jest w.
mogę umieścić dwa zadania w tablicy używają Task.WaitAny()
w pętli, sprawdzając, który z nich się zakończył i wywołuje odpowiedni moduł obsługi, ale ... jak to jest lepsze niż zwykłe stare callbacki? Czy to naprawdę nie jest zamierzony przypadek użycia async/czekania? Jeśli nie, w jaki sposób mogę użyć wywołań zwrotnych w trybie HttpClient.GetAsync()
?
Dla wyjaśnienia - zachowanie Jestem po to coś jak ten pseudo-kod:
client.GetAsyncWithCallback("http://example.com/", HandleExample);
client.GetAsyncWithCallback("http://stackoverflow.com/", HandleStackoverflow);
FWIW, ponieważ Task.WhenAll używa params w przeciążeniu pobierając tablicę, możesz zmienić ostatnią linię na Just WhenAll (task1, task2) i niech kompilator zbuduje dla ciebie tablicę :) http://msdn.microsoft .com/en-us/library/hh194874.aspx –
Ta odpowiedź tylko czeka na ich zakończenie. Nie "traktuje ich tak szybko, jak tylko powrócą ich odpowiedzi". –
[Wiem, że komentarz @ StephenCleary jest naprawdę stary, ale nie chciałem, aby ktokolwiek inny myślał o tym samym, aby się pomylić.] Ta odpowiedź obsługuje je w ich odpowiednich wywołaniach "ContinueWith" (których wynikiem są faktyczne zadania przypisane do ' task1' i 'task2'). Oczekiwane 'WhenAll' po prostu upewnia się, że oba te zadania są wykonywane przed wykonaniem jakichkolwiek linii poza nim. – patridge