web-dev-qa-db-ja.com

非同期を使用して多数の同時Webリクエストを作成して待機するにはどうすればよいですか?

私は でMicrosoftによる方法を読みます方法:asyncを使用して複数のWebリクエストを並行して作成し、待機する(C#) と見つかりました:

private async Task CreateMultipleTasksAsync()  
{  
    // Declare an HttpClient object, and increase the buffer size. The  
    // default buffer size is 65,536.  
    HttpClient client =  
        new HttpClient() { MaxResponseContentBufferSize = 1000000 };  

    // Create and start the tasks. As each task finishes, DisplayResults   
    // displays its length.  
    Task<int> download1 =   
        ProcessURLAsync("http://msdn.Microsoft.com", client);  
    Task<int> download2 =   
        ProcessURLAsync("http://msdn.Microsoft.com/library/hh156528(VS.110).aspx", client);  
    Task<int> download3 =   
        ProcessURLAsync("http://msdn.Microsoft.com/library/67w7t67f.aspx", client);  

    // Await each task.  
    int length1 = await download1;  
    int length2 = await download2;  
    int length3 = await download3;  

    int total = length1 + length2 + length3;  

    // Display the total count for the downloaded websites.  
    resultsTextBox.Text +=  
        string.Format("\r\n\r\nTotal bytes returned:  {0}\r\n", total);  
}  

私はこのコードを理解していますが、私の質問は次のとおりです。これをどのように変更して、それを好きなようにスケーリングできますか。

7
Buyo

非同期呼び出しをループで呼び出すことができます。各呼び出しはタスクを返す可能性があり、すべてのタスクが完了するまで待機する必要があります

var requestInfoCollection = new RequestInfo[]
{
     new RequestInfo("http://url1","GET"),
     new RequestInfo("http://url2","GET"),
     new RequestInfo("http://url2","POST")
};
List<Task> tasks = new List<Task>();
foreach(var requestInfo in requestInfoCollection)
{
   tasks.Add(ProcessURLAsync(requestInfo))
}
Task.WaitAll(tasks);

上記は複数のリクエストを呼び出し、結果を待ちますが、async\awaitは、外部呼び出し(http、dbなど...)の実行中に使用するアプリケーションにスレッドを解放するのに役立ちます。ただし、スケーリングはハードウェアとアプリケーションアーキテクチャによって異なります。

6
CreativeManix

私のアカウントの制限によりコメントはできませんが、@ CreativeManixの回答に応えて、

List<Task> tasks = new List<Task>();

Task.WaitAll(tasks)はタスクのリストを受け入れません。そのオーバーライドの1つは、タスクの配列を受け入れます。

Task.WaitAll(tasks.ToArray())
10
batuzai04123