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());
它在控制台中显示我: 结束1! (间隔1秒)
2月底! (间隔1秒)
3月底! (间隔1秒)
4月底! (间隔1秒)
5月底! (间隔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());
然后我有这个答案: (间隔5秒,一瞬间): 结束! 结束! 结束! 结束! 结束!
你能解释一下这个现象吗?
我认为:
这是因为变量“i”不断增加并且线程可以访问变量?在这种情况下,每个线程都会记住最后一个值“i”,因此每个线程将等待5秒并且只发送一条消息?
这是个好理由?
答案 0 :(得分:0)
在第二种情况下,由capture closure of loop variable使用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());