问题是变量 i
正在被捕获,当线程实际开始时,它是 2。
改用这个:
for (int i = 0; i < numberOfThreads; i++)
{
int value = x[i];
new Thread(() => DoWork(value)).Start();
}
或者:
foreach (int value in x)
{
int copy = value;
new Thread(() => DoWork(copy)).Start();
}
或者:
for (int i = 0; i < numberOfThreads; i++)
{
int copyOfI = i;
new Thread(() => DoWork(x[copyOfI])).Start();
}
在每种情况下,lambda 表达式都会在循环的每次迭代中捕获一个新变量——一个不会被后续迭代更改的变量。
通常,您应该避免在稍后执行的 lambda 表达式中捕获循环变量。有关更多详细信息,请参阅Eric Lippert关于该主题的博客文章。
从 C# 5 开始,很可能foreach
会更改循环行为以避免这成为问题 - 但for
循环等效项仍然是一个问题。