【问题标题】:How can I wait till the Parallel.ForEach completes我怎样才能等到 Parallel.ForEach 完成
【发布时间】:2011-12-14 18:47:55
【问题描述】:

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

【问题讨论】:

    标签: c# task-parallel-library


    【解决方案1】:

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

    【讨论】:

    • “Parallel.Foreach() 将等待其所有分支任务完成”在某些情况下可能会混淆,例如(内部异步任务): Parallel.ForEach(groupedUnreadMessages, async unreadMsgCollection => { /*有效*/});
    • 这是stackoverflow中的另一个问题:stackoverflow.com/questions/11564506/…
    • 这个答案来自 2011 年,在 async/await 之前。但就像我说的,在 ForEach 中生成线程并不是一个好主意。异步操作也不是。您发布的链接提供了很好的信息和解决方案。
    • “在 ForEach 中生成线程不是一个好主意”你可以扩展吗?那是“除非您确保在返回之前等待”吗?
    • 迟到的回复,但您不能 await 在 Parallel.For 循环内。这就是为什么这是一个坏主意。它不应该出现。
    【解决方案2】:

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

    更多信息可以找到here

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 在编写异步代码时,您应该避免使用ResultParallel.ForEach,因为它们都不适合异步。您可以查看here 的替代方案。
      • 当你可以做第一种模式时,最好不要使用异步方法作为同步。在Parallel.Foreach 中,我们最好使用await ... 而不是.Result
      • @MRebati 我首先尝试了那里的等待,但代码执行仍然没有等待......这就是为什么我尝试了 .Result 并且它以某种方式工作。但无论如何,也许我做错了什么
      • 此更改后它对我有用,请在此处参考类似的解决方案和其他一些解决方案:stackoverflow.com/a/40893434/12193988
      猜你喜欢
      • 2016-05-19
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多