Foreach循环和任务

时间:2010-05-27 21:59:30

标签: .net-4.0 foreach task

我从编码指南知道我已经读过你不应该这样做

for (int i = 0; i < 5; i++) 
{ 
    Task.Factory.StartNew(() => Console.WriteLine(i));
}
Console.ReadLine();

因为它会写5 5,我理解,我想我明白为什么会发生这种情况。我知道解决方案就是

for (int i = 0; i < 5; i++) 
{ 
    int localI = i;
    Task.Factory.StartNew(() => Console.WriteLine(localI));
}
Console.ReadLine();

然而这样的事情还可以吗?

foreach (MyClass myClass in myClassList) 
{ 
    Task.Factory.StartNew(() => myClass.DoAction());
}
Console.ReadLine();

或者我是否需要在for循环中执行相同的操作。

foreach (MyClass myClass in myClassList) 
{ 
    MyClass localMyClass = myClass;
    Task.Factory.StartNew(() => localMyClass.DoAction());
}
Console.ReadLine();

1 个答案:

答案 0 :(得分:6)

foreach完全相同的问题。以下内容:

foreach (MyClass myClass in myClassList) 
{ 
    Task.Factory.StartNew(() => myClass.DoAction());
}

很可能总是在列表的最后一个元素上调用DoAction方法,可以这样修复:

foreach (MyClass myClass in myClassList) 
{ 
    MyClass localMyClass = myClass;
    Task.Factory.StartNew(() => localMyClass.DoAction());
}

但我不建议您依赖本地变量,而是推荐以下内容:

for (int i = 0; i < 5; i++)
{
    Task.Factory.StartNew(localI => Console.WriteLine(localI), i);
}