Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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# 任务与增值_C#_Multithreading_Task - Fatal编程技术网

C# 任务与增值

C# 任务与增值,c#,multithreading,task,C#,Multithreading,Task,我写了代码: List<Task> tt = new List<Task>(); for (int i = 0; i < 5; i++) { tt.Add( new Task((o) => { Thread.Sleep(Convert.ToInt32(o)*1000); Console.WriteLine("end of {0}!", Convert.ToInt32(o)); },i)); }

我写了代码:

List<Task> tt = new List<Task>();
for (int i = 0; i < 5; i++)
{
    tt.Add(
    new Task((o) =>
    {
        Thread.Sleep(Convert.ToInt32(o)*1000);
        Console.WriteLine("end of {0}!", Convert.ToInt32(o));
    },i));
}

tt.ForEach(t => t.Start());
Task.WaitAll(tt.ToArray());
List tt=newlist();
对于(int i=0;i<5;i++)
{
tt.添加(
新任务((o)=>
{
线程睡眠(转换为32(o)*1000);
WriteLine(“结束{0}!”,Convert.ToInt32(o));
},i));
}
tt.ForEach(t=>t.Start());
Task.WaitAll(tt.ToArray());
它在控制台中显示: 1结束!(间隔1秒)

第二节结束!(间隔1秒)

第三节结束!(间隔1秒)

第四节结束!(间隔1秒)

五点结束!(间隔1秒)

但是如果我得到这个代码:

List<Task> tt = new List<Task>();
for (int i = 0; i < 5; i++)
{
    tt.Add(
    new Task( () =>
    {
        Thread.Sleep(i*1000);
        Console.Write("end! ");
    }));
}

tt.ForEach(t => t.Start());
Task.WaitAll(tt.ToArray());
List tt=newlist();
对于(int i=0;i<5;i++)
{
tt.添加(
新任务(()=>
{
线程。睡眠(i*1000);
控制台。写(“结束!”);
}));
}
tt.ForEach(t=>t.Start());
Task.WaitAll(tt.ToArray());
那么我的答案是: (间隔5秒,一瞬间完成): 终止 终止 终止 终止 结束

你能给我解释一下这种现象吗

我认为:

这是因为变量“i”不断递增,线程可以访问这些变量?在这种情况下,每个线程将记住最后一个值“i”,因此每个线程将等待5秒钟,然后发送一条消息


这是很好的理由?

在第二种情况下,使用的是
i
的最后一个值,即
5
,因为您可以将循环变量的值分配给某个局部变量,并在任务中使用该值

List<Task> tt = new List<Task>();
for (int i = 0; i < 5; i++)
{
    int temp = i;
    tt.Add(
    new Task( () =>
    {
        Thread.Sleep(temp * 1000);
        Console.Write("end! ");
    }));
}

tt.ForEach(t => t.Start());
Task.WaitAll(tt.ToArray());
List tt=newlist();
对于(int i=0;i<5;i++)
{
int-temp=i;
tt.添加(
新任务(()=>
{
线程睡眠(温度*1000);
控制台。写(“结束!”);
}));
}
tt.ForEach(t=>t.Start());
Task.WaitAll(tt.ToArray());

是的,您有一个由所有任务捕获的
i
变量。如果您在循环中声明一个局部变量,该循环获取
i
的副本,并在lambda表达式中使用该副本,那么就可以了。