以下代码无法正常工作。我究竟做错了什么?每次运行时输出都不同。有没有更好的方法呢?假设动作做的事情比下面的事情更复杂。
Action<int> action = (int m) =>
{
if ((m % 2) == 0)
Console.WriteLine("Even");
else
Console.WriteLine("Odd");
};
const int n = 10;
Task[] tasks = new Task[n];
for (int i = 0; i < n; i++)
{
tasks[i] = Task.Factory.StartNew(() => action(i+1));
}
Task.WaitAll(tasks);
答案 0 :(得分:3)
循环中的lambda每次循环都捕获对同一i
变量的引用,而不是值。
将循环更改为:
for (int i = 0; i < n; i++)
{
var j = i;
tasks[i] = Task.Factory.StartNew(() => action(j+1));
}
请注意,每次运行时输出仍然不同,但你应该得到五个偶数和五个奇数输出。