我如何等待直到并行。 ForEach 完成

我在当前的项目中使用 TPL,并且使用了并行。前伸,旋转许多线。Task 类包含等待() ,直到任务完成。就像这样,我怎么能等到平行线。然后执行下一个语句?

122829 次浏览

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

更新:

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

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

有一些可用的重载,“ body”方法应该返回一个 ValueTask。

在平行世界里不需要这个。Foreach: 它只在所有可用处理器的线程中执行 Foreach,但是它会同步返回。

更多信息可以找到 给你

正如这里的每个人所说——你不需要等待。我可以从我的经验中补充一点: 如果你有一个异步体执行,你 等待一些异步调用内,它只是运行通过我的代码,没有等待任何东西。所以我只是用 。结果代替了 等待-然后它就像预期的那样工作了。我不知道为什么会这样:/

我相信您可以像下面这样使用 IsCompleted:

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

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