用于共享内部变量的C#并行

用于共享内部变量的C#并行,c#,multithreading,parallel-processing,C#,Multithreading,Parallel Processing,嗨,我正在处理以下代码: Parallel.For(1, residRanges.Count, i => { int count = 0; List<double> colAList = new List<double>(); List<double> colBList = new List<double&

嗨,我正在处理以下代码:

            Parallel.For(1, residRanges.Count, i =>
            {
                int count = 0;
                List<double> colAList = new List<double>();
                List<double> colBList = new List<double>();
                for (int x = 0; x < residErrorData.Count; x++)
                {
                    foreach (pricateConnection in residErrorData[x].connList)
                    {
                        if (residRanges[i].connection == nc.connection)
                        {
                            colAList.Add(residErrorData[x].residualError);
                            colBList.Add(nc.freq);
                            count = count + 1;
                        }
                    }
                }
                colA = new double[count];
                colB = new double[count];
                for (int j = 0; j < count; j++)
                {
                    colA[j] = colAList[j];
                    colB[j] = colBList[j];
                }

                residRangeError tempresid = residRanges[i];
                tempresid = fitResid(tempresid, colA, colB);                    

                residRanges[i] = tempresid;
                residRanges[i].n = count;                        
                }
            });
Parallel.For(1,residRanges.Count,i=>
{
整数计数=0;
List colAList=新列表();
List colBList=新列表();
对于(int x=0;x
如果我不使用并行类,我的值似乎是准确的,但是当我出于某种原因使用并行类时,它会混淆colA和colB的值。它把它们混合在线程之间。我对并行处理相当陌生,但我一直在四处寻找,似乎找不到任何解决方案。有人知道为什么程序似乎在线程之间共享变量吗

我知道代码并不理想,我一直在尝试不同的方法来找出哪里出了问题。我现在不想对它进行必要的优化,而是想了解为什么不同循环中的变量没有保持分离

residRanges[]是类项目的列表。使用它的for循环似乎得到了正确的值,当并行运行时,它们只是开始混淆哪些值在哪里

谢谢你的帮助!我真的可以用它

(转载作为甜蜜、甜蜜业力的答案)

您的代码看起来好像
colA
colB
在lambda的作用域之外声明,这意味着变量引用可以引用不同的数组对象,因为不同的线程同时运行(例如,线程0将更改
colA
,而线程1位于j循环的

colA
colB
的声明移动到lambda内部:

...
Double[] colA = new double[count];
Double[] colB = new double[count];
for (int j = 0; j < count; j++)
...

闭包中还包含哪些其他变量?您可能正在进行线程不安全写入。我认为问题在于您正在将
colA
colB
从lambda中提升出来。将它们移动到局部范围。@Dai完全正确
colA
colB
是并行内部计算的局部,请尝试更改
 colA=new double[count];
to
var colA=new double[count];
colB相同非常感谢!这很有道理,我忘了我已经在循环之外创建了这些变量。非常感谢!
...             
residRanges[i] = fitResid( residRanges[i], colAList, colBList );
residRanges[i].n = count;        
...