【发布时间】:2016-12-13 20:52:05
【问题描述】:
我正在使用DownloadFileAsyncTask 方法下载文件。但是,当我在循环中执行它时,我得到一个异常,它告诉我不支持并发操作。我试着像这样修复它:
public async Task<string> Download(string uri, string path)
{
if (uri == null) return;
//manually wait for previous task to complete
while (Client.IsBusy)
{
await Task.Delay(10);
}
await Client.DownloadFileTaskAsync(new Uri(absoluteUri), path);
return path;
}
有时它会起作用,当迭代次数不大(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 线程。也许还有其他方法可以做到这一点?
【问题讨论】:
-
如果您只想让每个人都等到没有其他人在工作,然后他们才真正开始工作,为什么还要同时执行大量下载?如果您只想一次下载一个,则不要一次启动多个;只有在前一个完成后才为下一个加注星标。
-
。我不会在每次迭代中产生一个新的客户端,因为它会产生开销。 -> 真的是开销吗?
-
@Zbigniew 好吧,这就是并行执行各种下载与按顺序执行各种下载之间的区别。这将大大增加网络负载的密度。您是否真的想要(或能够)并行执行这些操作当然取决于具体情况。
-
是的,我不创建新实例的原因是速度较慢。
标签: c# async-await task webclient