. net 4.5并行处理和for循环

本文关键字:for 循环 并行处理 net | 更新日期: 2023-09-27 17:51:24

我正在尝试创建一个依赖于可用处理器数量的任务列表。我有一个for循环,它的行为似乎很奇怪。我知道javascript中闭包的概念,这里似乎也会发生类似的事情:

 var tasks = new Task[Environment.ProcessorCount]; 
 for(int x = 0; x < Environment.ProcessorCount; x ++)
 {
      tasks[x] = Task.Run(() => new Segment(SizeOfSegment, x * SizeOfSegment, listOfNumbers).generateNewList());
 }

我发现的是,当我在for循环中断行时,变量x似乎是正确的,所以它从0开始,以3结束(处理器数量为4)。但是,当我将断点放在构造函数段内时,我发现x实际上是4,当退一步调用堆栈。

. net 4.5并行处理和for循环

您在lambda表达式中捕获x -但是您有一个单个 x变量,它在整个循环过程中改变值,因此当您的任务实际运行时,它可能有不同的值。您需要在循环中创建变量的副本,在每次迭代中创建一个新的"变量实例"。然后,您可以安全地捕获变量:

for(int x = 0; x < Environment.ProcessorCount; x ++)
{
    int copy = x;
    tasks[x] = Task.Run(() => new Segment(SizeOfSegment,
                                          copy * SizeOfSegment,
                                          listOfNumbers).generateNewList());
}

(我也建议你将generateNewList重命名为GenerateNewList,以符合。net的命名约定。)