c# 为什么这个带有 task.run 的 for 循环打印超过 10 次?

Nik*_*vic 2 c# task

这里发生了什么?这个循环大部分时间只是打印:

10101010101010101010

有时这样:

51010101010101010101

当我调试它时,它会按顺序打印

0123456789

class Program
{
    static void Main (string[] args)
    {
        for ( int i = 0; i < 10; i++)
        {
            Task.Run(( ) => Console.Write(i));
        }
        Console.Read();
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*isF 5

如果您安装了 ReSharper,它会在 i 下方放置一个小曲线:

在此处输入图片说明

附注:

访问修改后的关闭

JetBrains的网站给出了这样的解释:

这可能看起来是正确的,但实际上,无论何时单击任何按钮,都只会使用 str 变量的最后一个值。这样做的原因是 foreach 展开到一个 while 循环中,但迭代变量是在这个循环之外定义的。这意味着当您显示消息框时,str 的值可能已经迭代到字符串集合中的最后一个值。

(显然他们的例子使用的是字符串而不是整数)。

它在调试下“有效”,因为其他事情正在发生,并且代码的执行方式与发布时不同。

解决方案是使用局部变量:

    for ( int i = 0; i < 10; i++)
    {
        int local = i;
        Task.Run(( ) => Console.Write(local));
    }
Run Code Online (Sandbox Code Playgroud)

但即便如此,也不能保证按您期望的顺序执行。我刚刚测试了这个并得到了他的结果:

0436215897

所以每个值都被处理,但顺序不确定。