Foreach循环任务
问题描述:
我从我已阅读codeing guidlines知道你不应该做Foreach循环任务
for (int i = 0; i < 5; i++)
{
Task.Factory.StartNew(() => Console.WriteLine(i));
}
Console.ReadLine();
,因为它会写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();
答
这与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);
}
我真的不关心的话,我刚才复制的代码http://download.microsoft.com/download/B/C/F/BCFD4868-1354-45E3 -B71B-B851CD78733D/ParallelPrograms inNET4_CodingGuidelines.pdf我真的只想知道关于foreach的情况。另外我的代码比我发布的代码稍微复杂一些。看看以前的版本,看看我真的在做什么。 – 2010-05-28 13:19:05
这与'foreach'是一样的。 – 2010-05-28 13:24:24
不仅它和foreach是一样的,而且在值和引用类型之间。 http://*.com/questions/235455/access-to-modified-closure我只花了一天的更好的一部分,试图调试其中之一,直到一位同事指出我的错误。 – 2011-06-09 20:55:44