如何使用 async 和 await 发出大量并发 Web 请求?
How to make a lot of concurrent web requests using async and await?
我阅读了 Microsoft 的操作方法,网址为
How to: Make Multiple Web Requests in Parallel by Using async and await (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);
}
我理解这段代码,但我的问题是:我如何修改它以将其缩放到喜欢的程度,比方说一百或一千?
您可以在循环中调用异步调用。每次调用可能 return 一个任务,您必须等待所有任务完成
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 等...)时使用。但扩展取决于您的硬件和应用程序架构。
由于我的帐户限制,我无法发表评论,但回复@CreativeManix 的回答,
List<Task> tasks = new List<Task>();
Task.WaitAll(tasks)
将不接受任务列表。它的覆盖之一接受任务数组。
Task.WaitAll(tasks.ToArray())
我阅读了 Microsoft 的操作方法,网址为 How to: Make Multiple Web Requests in Parallel by Using async and await (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);
}
我理解这段代码,但我的问题是:我如何修改它以将其缩放到喜欢的程度,比方说一百或一千?
您可以在循环中调用异步调用。每次调用可能 return 一个任务,您必须等待所有任务完成
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 等...)时使用。但扩展取决于您的硬件和应用程序架构。
由于我的帐户限制,我无法发表评论,但回复@CreativeManix 的回答,
List<Task> tasks = new List<Task>();
Task.WaitAll(tasks)
将不接受任务列表。它的覆盖之一接受任务数组。
Task.WaitAll(tasks.ToArray())