Come si avvia più HttpClient.GetAsync()
richieste in una sola volta, e loro ogni gestire più presto le loro rispettive risposte tornano? Innanzitutto quello che ho provato è:partire asincrona multiple/attendere funzioni contemporaneamente e gestire separatamente
var response1 = await client.GetAsync("http://example.com/");
var response2 = await client.GetAsync("http://stackoverflow.com/");
HandleExample(response1);
HandleStackoverflow(response2);
Ma ovviamente è ancora sequenziale. Allora ho provato entrambi A partire da subito:
var task1 = client.GetAsync("http://example.com/");
var task2 = client.GetAsync("http://stackoverflow.com/");
HandleExample(await task1);
HandleStackoverflow(await task2);
Ora i compiti sono iniziato allo stesso tempo, che è buono, ma naturalmente il codice ha ancora aspettare per uno dopo l'altro.
Quello che voglio è quello di essere in grado di gestire la risposta "example.com" non appena si entra, e la risposta "stackoverflow.com" non appena si entra.
ho potuto mettere il due attività in un array usano Task.WaitAny()
in un ciclo, controllando quale è terminato e chiama il gestore appropriato, ma poi ... come è meglio che i normali vecchi callback? O questo non è davvero un caso d'uso previsto per async/await? In caso contrario, come utilizzerei lo HttpClient.GetAsync()
con i callback?
Per chiarire - il comportamento che sto cercando è qualcosa di simile pseudo-codice:
client.GetAsyncWithCallback("http://example.com/", HandleExample);
client.GetAsyncWithCallback("http://stackoverflow.com/", HandleStackoverflow);
FWIW, poiché Task.WhenAll utilizza i parametri nel sovraccarico per prendere un array, è possibile modificare l'ultima riga in Solo quandoTutto (task1, task2) e lasciare che il compilatore generi l'array per te :) http://msdn.microsoft .com/it-it/library/hh194874.aspx –
Questa risposta aspetta solo che entrambi vengano completati. Non "li maneggia entrambi non appena le loro rispettive risposte tornano". –
[So che il commento di StephenCleary è davvero vecchio, ma non volevo che nessun altro pensasse la stessa cosa per essere confuso.] Questa risposta li gestisce ciascuno nelle rispettive chiamate 'ContinueWith' (il cui risultato sono i compiti assegnati a' task1' e 'task2'). L'atteso 'WhenAll' semplicemente si assicura che entrambe le attività di" handlings "vengano eseguite prima che vengano eseguite le righe successive. – patridge