10

我在How to: Make Multiple Web Requests in Parallel by Using async and await (C#) 中阅读了 Microsoft 的 操作指南 ,发现:

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);  
}  

我理解这段代码,但我的问题是:如何修改它以将其缩放到喜欢的程度,比如说一百或一千?

4

2 回答 2

12

由于我的帐户受到限制,我无法发表评论,但在回复@CreativeManix 的回答时,

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

Task.WaitAll(tasks)将不接受任务列表。其中一个覆盖接受一个任务数组。

Task.WaitAll(tasks.ToArray())
于 2018-08-03T04:23:43.013 回答
8

您可以在循环中调用异步调用。每个调用都可能返回一个任务,您必须等待所有任务完成

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 等)时使用。但是扩展取决于您的硬件和应用程序架构。

于 2018-01-02T04:27:57.250 回答