线程安全传递整数到Action with Task

时间:2014-02-20 22:10:35

标签: c# .net

以下代码无法正常工作。我究竟做错了什么?每次运行时输出都不同。有没有更好的方法呢?假设动作做的事情比下面的事情更复杂。

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);

1 个答案:

答案 0 :(得分:3)

循环中的lambda每次循环都捕获对同一i 变量的引用,而不是

将循环更改为:

for (int i = 0; i < n; i++)
{
    var j = i;
    tasks[i] = Task.Factory.StartNew(() => action(j+1));
}

请注意,每次运行时输出仍然不同,但你应该得到五个偶数和五个奇数输出。