2016-12-13 31 views
1

我正在使用DownloadFileAsyncTask方法来下载文件。但是,当我在一个循环中执行它时,我得到一个异常,它告诉我不支持并发操作。我试图解决这个问题是这样的:如何让WebClient等到上一次下载完成?

​​

有时它的工作原理,当迭代次数并不大(1-5),而当它运行10次或更多次我得到这个错误。 Client这里是一个WebClient,我创建一次。我不会在每次迭代中生成新的客户端,因为它会产生开销。 回到我说的是,如何让WebClient在上次下载完成之前等待?这里的一个问题是为什么IsBusy适用于少量的下载。 我使用的代码:

public IEnumerable<Task<string>> GetPathById(IEnumerable<Photo> photos) 
    { 
     return photos?.Select(
        async photo => 
        { 
         var path = await Download(Uri, Path); 
         return path; 
        }); 
    } 

我想下载多个文件,并不会阻止我的UI线程。也许还有其他方法可以做到这一点?

+3

你为什么在同一时间在第一时间进行大量下载,如果你只是曾经打算让他们每个人等到没有其他人的工作实际上他们做他们的工作过吗?如果你只想一次只下载一个,那么一次不要启动多个;只有在前一个结束时才会出现下一个。 – Servy

+1

。我不会在每次迭代中生成新的客户端,因为它会产生开销。 - >它真的是一个开销吗? – MistyK

+0

@Zbigniew嗯,这是区别执行各种下载并行VS顺序。这会显着增加网络负载的密度。您是否真的想要(或能够)并行执行操作,当然取决于具体情况。 – Servy

回答

2

你错过了很多必要的代码来帮助你,所以我写了这个快速的例子,告诉你我想你可能想尝试一下。它在.NET Core中基本相同,只需将HttpClient交换为WebClient即可。

static void Main(string[] args) 
{ 
    Task.Run(async() => 
    { 
     var toDownload = new string[] { "http://google.com", "http://microsoft.com", "http://apple.com" }; 
     var client = new HttpClient(); 

     var downloadedItems = await DownloadItems(client, toDownload); 

     Console.WriteLine("This is async"); 

     foreach (var item in downloadedItems) 
     { 
      Console.WriteLine(item); 
     } 

     Console.ReadLine(); 
    }).Wait(); 
} 

static async Task<IEnumerable<string>> DownloadItems(HttpClient client, string[] uris) 
{ 
    // This sets up each page to be downloaded using the same HttpClient. 
    var items = new List<string>(); 
    foreach (var uri in uris) 
    { 
     var item = await Download(client, uri); 
     items.Add(item); 
    } 
    return items; 
} 

static async Task<string> Download(HttpClient client, string uri) 
{ 
    // This download the page and returns the content. 
    if (string.IsNullOrEmpty(uri)) return null; 

    var content = await client.GetStringAsync(uri); 
    return content; 
} 
+1

你应该很少使用'ContinueWith'。在极少数情况下,你应该几乎总是使用'await',你真的*知道你在做什么。 – Servy

+0

@Servy我已更新我的代码以删除ContinueWith。 – Stephen

相关问题