任务和增量值

时间:2014-04-04 09:14:02

标签: 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));
}

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秒并且只发送一条消息?

这是个好理由?

1 个答案:

答案 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());