我怎么能等到平行.ForEach完成

本文关键字:ForEach 完成 怎么能 | 更新日期: 2023-09-27 18:12:24

我在我当前的项目中使用TPL并使用Parallel。每个人都要纺很多条线。Task类包含Wait()来等待任务完成。就这样,我怎么能等待平行线呢。ForEach完成,然后进入执行下一个语句?

我怎么能等到平行.ForEach完成

您不需要做任何特别的事情,Parallel.Foreach()将等待直到所有分支任务完成。在调用线程中,你可以将其视为单个同步语句,例如将其包装在try/catch中。

更新:

旧的并行类方法不适合异步(基于任务的)编程。但是从。net 6开始我们可以使用Parallel.ForEachAsync()

await Parallel.ForEachAsync(items, (item, cancellationToken) =>
  {
     await ... 
  });

有一些可用的重载和'body'方法应该返回一个ValueTask

使用Parallel时不需要这样。Foreach:它只在有多少处理器可用的线程中执行Foreach,但它是同步返回的。

更多信息请点击此处

就像这里每个人说的,你不需要等待。根据我的经验,我可以补充:如果你有一个异步体要执行,并且你等待里面的一些异步调用,它只是通过我的代码运行,而不等待任何东西。所以我只是用替换了await。Result -然后按预期工作。我不知道为什么会这样:/

如果您将任务的结果存储在List中,请确保使用线程安全的数据结构,如ConcurrentBag,否则,由于并发写问题,一些结果将丢失。

我相信你可以像这样使用IsCompleted:

if(Parallel.ForEach(files, f => ProcessFiles(f)).IsCompleted)
{
    // DO STUFF                
}