C#-在for循环中运行任务不起作用

时间:2018-12-11 23:47:28

标签: c# task

我正在尝试使用4个任务求和一个字节数组的所有值。因此,我在main方法中编写了一个for循环,每次循环时启动并运行一个新任务:

for (int i = 0; i < tasks.Length; i++)
{
    Task.Run(() => Sum(i));
}

Sum方法的参数是partNumber。在Sum方法中,它执行的第一件事是:

Console.WriteLine("I is " + i);

当我运行它时,它向我显示:

I is 4
I is 4
I is 4
I is 4

但是,如果我这样写的话:

Task.Run(() => Sum(0));
Task.Run(() => Sum(1));
Task.Run(() => Sum(2));
Task.Run(() => Sum(3));

打印结果:

I is 0
I is 1
I is 2
I is 3

我的问题是为什么?如何使用for循环而不是重复代码来运行4个任务?

非常感谢。

1 个答案:

答案 0 :(得分:-1)

您遇到了lambda捕获常见问题。您需要

for (int i = 0; i < tasks.Length; i++)
{
   var capi = i;
   Task.Run(() => Sum(capi));
}

埃里克·利珀特(Eric Lippert)对此进行了精彩的讨论

https://blogs.msdn.microsoft.com/ericlippert/2009/11/12/closing-over-the-loop-variable-considered-harmful/