使用异步任务下载图像

时间:2014-02-27 19:06:05

标签: c# asynchronous task

我想使用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;
    }

2 个答案:

答案 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实例。