Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#为什么这个for循环使用task.run打印超过10次?_C#_Task - Fatal编程技术网

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

c#为什么这个for循环使用task.run打印超过10次?,c#,task,C#,Task,这是怎么回事?此循环大部分时间仅打印以下内容: 10101010101010101010 有时: 51010101010101010101 当我调试它时,它会按顺序打印 0123456789 类程序 { 静态void Main(字符串[]参数) { 对于(int i=0;iConsole.Write(i)); } Console.Read(); } } 如果安装了ReSharper,它会在i: 请注意: 使用修改后的闭包 政府对此作出解释: 这看起来可能是正确的,但实际上,只要单击任何按钮,就

这是怎么回事?此循环大部分时间仅打印以下内容:

10101010101010101010

有时:

51010101010101010101

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

0123456789

类程序
{
静态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));
    }