如何啓動多個HttpClient.GetAsync()
請求一次,並且只要他們各自的反應回來處理它們每?首先我試過的是:啓動多個異步/一次等待功能和處理它們分別
var response1 = await client.GetAsync("http://example.com/");
var response2 = await client.GetAsync("http://stackoverflow.com/");
HandleExample(response1);
HandleStackoverflow(response2);
但當然它仍然是連續的。於是我試着開始他們倆在一次:
var task1 = client.GetAsync("http://example.com/");
var task2 = client.GetAsync("http://stackoverflow.com/");
HandleExample(await task1);
HandleStackoverflow(await task2);
現在的任務是在同一時間,這是很好的開始,但當然,代碼仍然必須等待一前一後。
我要的是能夠儘快處理「example.com」響應,它有,並儘快談到在「stackoverflow.com」響應。
我可以把兩個任務在一個陣列在一個循環的使用Task.WaitAny()
,檢查哪一個成品,並調用相應的處理程序,但後來......怎麼就是不只是普通的舊回調更好?或者,這不是真正意義上的異步/等待用例嗎?如果沒有,我會怎麼用HttpClient.GetAsync()
有回調?
爲了澄清 - 我以後的行爲是這樣的僞代碼:
client.GetAsyncWithCallback("http://example.com/", HandleExample);
client.GetAsyncWithCallback("http://stackoverflow.com/", HandleStackoverflow);
FWIW,因爲Task.WhenAll使用PARAMS過載取一個數組,你可以改變的最後一行只WhenAll(TASK1,TASK2),讓編譯器生成數組爲你:) http://msdn.microsoft .COM/EN-US /庫/ hh194874。aspx –
這個答案只是等待他們倆完成。它不會「在各自的反應回來後立即處理它們」。 –
[我知道@ StephenCleary的評論真的很老,但我不想讓其他人想到同樣的事情會感到困惑。]這個答案在他們各自的'ContinueWith'調用中處理它們(其結果是分配給' task1'和'task2')。等待的'WhenAll'只是確保這些「處理」任務都在任何超出它的行被執行之前完成。 – patridge