这里发生了什么?这个循环大部分时间只是打印:
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)
如果您安装了 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
所以每个值都被处理,但顺序不确定。
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |