我怎么能等到Parallel.ForEach完成

VJA*_*JAI 113 c# task-parallel-library

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

Hen*_*man 181

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

  • "Parallel.Foreach()将等待所有分支任务完成"在某些情况下可能会混淆,如(内部异步任务):Parallel.ForEach(groupedUnreadMessages,async unreadMsgCollection => {/*works*/}); (9认同)
  • 这个答案来自2011年,在async/await之前.但就像我说的那样,在ForEach中产生线程并不是一个好主意.两者都不是异步动作.您发布的链接提供了良好的信息和解决方案. (3认同)
  • “在 ForEach 内生成线程不是一个好主意”您可以扩展一下吗?这是“除非你确保在返回之前等待”吗? (2认同)

Lou*_*ann 15

你不需要使用Parallel.Foreach:它只在尽可能多的线程中执行foreach,因为它有可用的处理器,但它同步返回.

更多信息可以在这里找到

  • 它使用的(最大)线程数并不那么简单. (11认同)

小智 10

正如这里的每个人所说 - 你不需要等待。根据我的经验,我可以补充一点:如果您有一个异步主体要执行,并且您在内部等待一些异步调用,那么它只会运行我的代码,而不会等待任何内容。所以我只是用.Result替换了等待- 然后它按预期工作。我不知道为什么会这样:/