.net 4.0 Foreach循环和任务

.net 4.0 Foreach循环和任务,.net-4.0,foreach,task,.net 4.0,Foreach,Task,我从编码指南中知道,我读过你不应该这样做 for (int i = 0; i < 5; i++) { Task.Factory.StartNew(() => Console.WriteLine(i)); } Console.ReadLine(); 或者我需要做我在for循环中做的同样的事情 foreach (MyClass myClass in myClassList) { MyClass localMyClass = myClass; Task.F

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

for (int i = 0; i < 5; i++) 
{ 
    Task.Factory.StartNew(() => Console.WriteLine(i));
}
Console.ReadLine();
或者我需要做我在for循环中做的同样的事情

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

这与
foreach
的问题完全相同。以下是:

foreach (MyClass myClass in myClassList) 
{ 
    Task.Factory.StartNew(() => myClass.DoAction());
}
for (int i = 0; i < 5; i++)
{
    Task.Factory.StartNew(localI => Console.WriteLine(localI), i);
}
将很可能总是在列表的最后一个元素上调用DoAction方法,可以这样修复:

foreach (MyClass myClass in myClassList) 
{ 
    MyClass localMyClass = myClass;
    Task.Factory.StartNew(() => localMyClass.DoAction());
}
但我建议您不要依赖于局部变量:

foreach (MyClass myClass in myClassList) 
{ 
    Task.Factory.StartNew(() => myClass.DoAction());
}
for (int i = 0; i < 5; i++)
{
    Task.Factory.StartNew(localI => Console.WriteLine(localI), i);
}
for(int i=0;i<5;i++)
{
Task.Factory.StartNew(localI=>Console.WriteLine(localI),i);
}

我并不真正关心for案例,我只是从中复制了代码,我只想了解foreach案例。而且我的代码比我发布的代码要复杂一点。查看上一个版本,看看我真正在做什么。这与
foreach
是一样的。不仅for和foreach之间是一样的,而且值和引用类型之间也是一样的。我花了一天的大部分时间试着调试其中一个,直到一位同事指出我的错误。@DarinDimitrov请您检查一下这个: