【问题标题】:Parallel.ForEach produces inaccurate outputParallel.ForEach 产生不准确的输出
【发布时间】:2012-11-13 20:37:40
【问题描述】:

我有一个场景,我必须运行嵌套的 foreach 来创建一个列表。我所做的伪代码如下

foreach(var x in list)           (ForEach1)
   get m // List<string>
   foreach(var k in m)           (ForEach2)
     get t // List<string>
        foreach(var o in t)      (ForEach3)
          // Do some work. and add output to a list
          // which is defined before first for each

但是,因为我在 Foreach2 和 Foreach3 中从外部系统(通过运行 Perforce 命令从 Perforce)检索数据,所以这段代码运行速度非常慢,我确实需要加快速度。

我尝试使用 Parallel.ForEach 并行运行 ForEach1 或 ForEach2。在我的测试中,它显着提高了性能,但产生了不准确的结果。

  • 如果我使用 foreach 语句运行此代码,我生成的列表有 625 个项目(这是正确的)
  • 如果我将 Parallel.ForEach 用于 ForEach1,我会在列表中添加 325,这远低于我的预期。
  • 最后,如果我将 Parallel.ForEach 用于 ForEach2,我将 605 项添加到列表中,但仍有 20 项缺失。

我不确定我做错了什么,或者我错过了什么。使用并行 foreach 或 for 时需要考虑哪些事项?

谁能帮我解决一下?任何其他提高性能的建议将不胜感激

谢谢

【问题讨论】:

  • 您是否尝试过使用 ForEach3 的并行版本?
  • 听起来像是某种竞争条件。您为最终结果添加的集合是线程安全集合(例如 ConcurrentBag)吗?
  • @Taner ForEach3 是什么?
  • @flipchart 不是,但现在是,但没有任何改变,恐怕。

标签: c#-4.0 parallel-processing


【解决方案1】:

我不知道您的“获取”操作是什么,但这也可能是闭包的问题。 你可以在网上搜索它。 例如The foreach identifier and closureshttp://www.codethinked.com/c-closures-explained

【讨论】:

  • 大概就是这样。如何修复的一个例子会很好。例如,不要写get t; foreach (var o in t),而是写get t; var t_copy = t; foreach (var o in t_copy)
猜你喜欢
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
相关资源
最近更新 更多