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表达式中使用该副本,那么就可以了。