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)
这绝对是同样的问题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)