我正在尝试使用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个任务?
非常感谢。
答案 0 :(得分:-1)
您遇到了lambda捕获常见问题。您需要
for (int i = 0; i < tasks.Length; i++)
{
var capi = i;
Task.Run(() => Sum(capi));
}
埃里克·利珀特(Eric Lippert)对此进行了精彩的讨论