【问题标题】:Await Parallel.ForEach [duplicate]等待 Parallel.ForEach [重复]
【发布时间】:2016-06-01 11:04:19
【问题描述】:

我陷入了必须从 url 列表中下载多个文件的情况。我发现Parallel.ForEach 是一个解决方案,它确实比简单的 foreach 运行得更快。但此解决方案不会等待所有下载完成。

List<string> list = new List<string>() {"url1","url2","url3",... };

public async void downloadSimpleFile(string fileUrl) {
    //download file logic
}

await Task.Factory.StartNew(() => Parallel.ForEach(list,
    new ParallelOptions { MaxDegreeOfParallelism = 10 }, downloadSimpleFile));

我也在绑:

public async Task<bool> downloadSimpleFile(string fileUrl) {
    //download file logic
    return true;
}

现在我该如何在Parallel.ForEach 中使用downloadSimpleFile,因为上面提到的代码不再工作了?

我在Parallel 中阅读了一些关于异步等待的帖子,例如thisthis,但我不明白。任何想法都值得赞赏。

【问题讨论】:

  • 它运行得更快因为它没有等待。正如您链接到的问题中所说,您可能不想这样做。只需创建所有任务并使用Task.WhenAll 等待完成。

标签: c# asynchronous foreach parallel-processing


【解决方案1】:

使用Task.WhenAll 方法。以下代码应该可以工作:

public async Task<bool> downloadSimpleFile(string fileUrl)
{
    //download file logic
    return true;
}

public async Task ProcessList()
{
    var list = new List<string> {"url1", "url2", "url3" };
    var downloadFiles = list.Select(downloadSimpleFile).ToArray();

    var result = await Task.WhenAll(downloadFiles);
}

【讨论】:

  • 我测试了这个方法,看起来任务不是同时启动的,每个downloadSimpleFile调用有大约0.2秒的差异
猜你喜欢
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 2023-01-27
相关资源
最近更新 更多