2011-10-25 241 views
78

我在当前项目中使用TPL并使用Parallel.Foreach来旋转很多线程。 Task类包含Wait()以等待任务完成。那样,我该如何等待Parallel.ForEach完成,然后再执行下一个语句?我该如何等待Parallel.ForEach完成

回答

132

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

+2

“Parallel.Foreach()将等到所有分支任务完成”,它可以在某些情况下混淆,如(异步任务内):Parallel.ForEach(groupedUnreadMessages, async unreadMsgCollection => {/ * works * /}); –

+0

这里是其他问题在stackoverflow:http://stackoverflow.com/questions/11564506/nesting-await-in-parallell-foreach –

+1

这个答案是从2011年,在async/await之前。但正如我所说的,在ForEach内部产生线程并不是一个好主意。也不是一个异步行动。您发布的链接提供了很好的信息和解决方案。 –

11

在Parallel.Foreach中不需要这么做:它只在与可用处理器一样多的线程中执行foreach,但它会同步返回。

的更多信息,可以发现here

+9

它使用的(最大)线程数并不那么简单。 –