【问题标题】:C# - Running a task in a for loop doesn't work [duplicate]C# - 在 for 循环中运行任务不起作用[重复]
【发布时间】:2018-12-11 23:47:27
【问题描述】:

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

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

Sum 方法的参数是partitionNumber。在 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 任务?

非常感谢。

【问题讨论】:

标签: c# task


【解决方案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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2014-11-03
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    相关资源
    最近更新 更多