我想使用C#中的任务同时从网站下载一些图片。调用WaitAll()时应用程序挂起。这是我的代码:
HttpClient client = new HttpClient() { MaxResponseContentBufferSize = 1000000 };
List<Task<byte[]>> tasks = new List<Task<byte[]>>();
for (int i = 0; i < 10; i++)
{
string url = string.Format("http://www.myurl.com/files//53/{0}page.jpg",i);
Task<byte[]> download = ProcessURLAsync(url, client);
tasks.Add(download);
}
Task.WaitAll(tasks.ToArray());
方法ProcessURLAsync:
async Task<byte[]> ProcessURLAsync(string url, HttpClient client)
{
var byteArray = await client.GetByteArrayAsync(url);
return byteArray;
}
答案 0 :(得分:4)
使用await Task.WhenAll(tasks);
由于Task.WaitAll
阻止了调用线程。
另外,您可以使用相同的HttpClient实例:)它专为多个并发请求而设计。请参阅http://msdn.microsoft.com/en-us/library/system.net.http.httpclient(v=vs.110).aspx
的备注部分答案 1 :(得分:2)
您应该使用Task.WaitAll
而不是await Task.WhenAll
。这将异步等待任务完成。 Task.WaitAll
按设计阻止 ,直到任务全部完成。
在旁注中,每个请求都应该使用它自己的HttpClient
实例。