8

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」の応答をすぐに処理できるようにすることです。

2 つのタスクを配列に入れてTask.WaitAny()ループで使用し、どちらが終了したかを確認して適切なハンドラーを呼び出すこともできますが、それでは、通常の古いコールバックよりもどのように優れているのでしょうか。それとも、これは本当に async/await の意図された使用例ではないのでしょうか? そうでない場合、コールバックでどのように使用HttpClient.GetAsync()しますか?

明確にするために-私が求めている動作は、次の擬似コードのようなものです:

client.GetAsyncWithCallback("http://example.com/", HandleExample);
client.GetAsyncWithCallback("http://stackoverflow.com/", HandleStackoverflow);
4

3 に答える 3

14

を使用ContinueWithして、WhenAll新しい1つを待つことができTask、task1とtask2が並行して実行されます

var task1 = client.GetAsync("http://example.com/")
                  .ContinueWith(t => HandleExample(t.Result));

var task2 = client.GetAsync("http://stackoverflow.com/")
                  .ContinueWith(t => HandleStackoverflow(t.Result));

var results = await Task.WhenAll(new[] { task1, task2 });
于 2012-10-17T10:26:33.760 に答える
4

非同期関数を宣言し、コールバックを次の場所に渡します。

void async GetAndHandleAsync(string url, Action<HttpResponseMessage> callback)
{
    var result = await client.GetAsync(url);
    callback(result);
}

そして、それを複数回呼び出すだけです。

GetAndHandleAsync("http://example.com/", HandleExample);
GetAndHandleAsync("http://stackoverflow.com/", HandleStackoverflow);
于 2012-10-17T10:27:05.630 に答える