我正在使用TPL来进行我的当前项目,并且使用Parallel.ForEach来启动多个线程。Task类包含Wait()方法,以等待任务完成。同样的,我该如何等待Parallel.ForEach完成后再执行下一条语句?
我正在使用TPL来进行我的当前项目,并且使用Parallel.ForEach来启动多个线程。Task类包含Wait()方法,以等待任务完成。同样的,我该如何等待Parallel.ForEach完成后再执行下一条语句?
你不需要做任何特殊的工作,Parallel.Foreach()
会等待其所有分支任务完成。从调用线程的角度来看,你可以将其视为单个同步语句,例如,在try/catch语句中包装它。
旧的Parallel类方法不适合异步(基于Task的)编程。但是,从dotnet 6开始,我们可以使用Parallel.ForEachAsync()
。
await Parallel.ForEachAsync(items, (item, cancellationToken) =>
{
await ...
});
有几个可用的重载方法,'body' 方法应该返回一个 ValueTask。
正如大家所说 - 你不需要等待。根据我的经验,我可以补充一点: 如果你有一个异步体需要执行,并且在其中使用await调用了一些异步方法,它会直接运行我的代码并且不会等待任何东西。因此,我只需将await替换为.Result - 然后它就按预期工作了。但是我不知道这是为什么 :/
Parallel.Foreach
中,我们最好使用 await ...
而不是 .Result
。 - MRebati我相信你可以像下面这样使用IsCompleted:
if(Parallel.ForEach(files, f => ProcessFiles(f)).IsCompleted)
{
// DO STUFF
}