Foreach循环和任务

Sco*_*ain 6 foreach .net-4.0 task

我从编码指南中知道我读过你不该做的

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

因为它会写5 5,我明白了,我想我明白为什么会这样.我知道解决方案就是做

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

不过这样的事可以吗?

foreach (MyClass myClass in myClassList) 
{ 
    Task.Factory.StartNew(() => myClass.DoAction());
}
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

或者我需要做与在for循环中所做的相同的事情.

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

Dar*_*rov 6

这绝对是同样的问题foreach.下列:

foreach (MyClass myClass in myClassList) 
{ 
    Task.Factory.StartNew(() => myClass.DoAction());
}
Run Code Online (Sandbox Code Playgroud)

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

foreach (MyClass myClass in myClassList) 
{ 
    MyClass localMyClass = myClass;
    Task.Factory.StartNew(() => localMyClass.DoAction());
}
Run Code Online (Sandbox Code Playgroud)

但我不建议您依赖局部变量,而是建议您:

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