c#为什么这个for循环使用task.run打印超过10次?
这是怎么回事?此循环大部分时间仅打印以下内容: 10101010101010101010 有时: 51010101010101010101 当我调试它时,它会按顺序打印 0123456789c#为什么这个for循环使用task.run打印超过10次?,c#,task,C#,Task,这是怎么回事?此循环大部分时间仅打印以下内容: 10101010101010101010 有时: 51010101010101010101 当我调试它时,它会按顺序打印 0123456789 类程序 { 静态void Main(字符串[]参数) { 对于(int i=0;iConsole.Write(i)); } Console.Read(); } } 如果安装了ReSharper,它会在i: 请注意: 使用修改后的闭包 政府对此作出解释: 这看起来可能是正确的,但实际上,只要单击任何按钮,就
类程序
{
静态void Main(字符串[]参数)
{
对于(int i=0;i<10;i++)
{
Task.Run(()=>Console.Write(i));
}
Console.Read();
}
}
如果安装了ReSharper,它会在i:
请注意:
使用修改后的闭包
政府对此作出解释:
这看起来可能是正确的,但实际上,只要单击任何按钮,就只会使用str变量的最后一个值。原因是foreach展开到while循环中,但迭代变量是在该循环之外定义的。这意味着,在显示消息框时,str的值可能已经迭代到strings集合中的最后一个值
(显然,他们的示例使用的是字符串而不是int)
它在调试下“工作”,因为其他事情正在进行,并且代码的执行与发行版中的不同
解决方案是使用局部变量:
for ( int i = 0; i < 10; i++)
{
int local = i;
Task.Run(( ) => Console.Write(local));
}
for(int i=0;i<10;i++)
{
int local=i;
Task.Run(()=>Console.Write(本地));
}
但即便如此,也不能保证按照您期望的顺序执行。我刚刚测试了这个,结果是:
0436215897
因此,每个值都被处理,但顺序不确定。Lambda捕获变量,而不是值。Lambda捕获变量,这意味着所有任务都试图读取相同的值。其中一些读取值
5
,另一些读取最后一个值10
for ( int i = 0; i < 10; i++)
{
int local = i;
Task.Run(( ) => Console.Write(local));
}