C# 4.0 Parallel.ForEach产生不准确的输出

C# 4.0 Parallel.ForEach产生不准确的输出,c#-4.0,parallel-processing,C# 4.0,Parallel Processing,我有一个场景,我必须运行嵌套的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) /

我有一个场景,我必须运行嵌套的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
foreach(列表中的变量x)(ForEach1)
获取m//列表
foreach(变量k,单位m)(ForEach2)
获取t//列表
foreach(t中的变量o)(ForEach3)
//做一些工作。并将输出添加到列表中
//在第一个之前为每个
但是,因为我在Foreach2和Foreach3中从外部系统(通过运行Perforce命令从Perforce)检索数据,所以这段代码运行非常慢,我确实需要加快速度

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

  • 如果我用foreach语句运行这段代码,我生成的列表有625项(这是正确的)
  • 如果我将Parallel.ForEach用于ForEach1,则列表中会添加325,这远远低于我的预期
  • 最后,如果我将Parallel.ForEach用于ForEach2,我会将605个项目添加到列表中,仍然缺少20个项目
我不确定我做错了什么,或者我错过了什么。使用并行foreach或for时需要考虑哪些事项

谁能帮我整理一下吗?如有任何其他改进绩效的建议,将不胜感激


谢谢

我不知道您的“get”操作是什么,但它也可能是闭包的问题。 你可以在网上搜索它。
例如和

我不知道您的“get”操作是什么,但它也可能是闭包的问题。 你可以在网上搜索它。
例如和

这可能会有所帮助。您是否尝试过在ForEach3中使用并行版本?听起来像是某种竞争条件。您为最终结果添加的集合是否为线程安全集合(例如ConcurrentBag)?@Taner什么是ForEach3?@flipchart不是,但现在是,但我担心它没有改变任何内容。这可能会有所帮助。您尝试过为ForEach3使用并行版本吗?听起来像是某种竞争条件。您为最终结果添加的集合是否为线程安全集合(例如ConcurrentBag)?@Taner ForEach3是什么?@flipchart不是,但现在是,但恐怕没有改变任何内容。可能就是这样。一个关于如何修复的示例会很好。例如,而不是
get t;foreach(t中的var o)
,write
get t;var t_copy=t;foreach(t_copy中的var o)
可能就是这样。一个关于如何修复的示例会很好。例如,而不是
get t;foreach(t中的var o)
,write
get t;var t_copy=t;foreach(副本中的var o)