Foreach循环任务

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); 
} 
+0

我真的不关心的话,我刚才复制的代码http://download.microsoft.com/download/B/C/F/BCFD4868-1354-45E3 -B71B-B851CD78733D/ParallelPrograms inNET4_CodingGuidelines.pdf我真的只想知道关于foreach的情况。另外我的代码比我发布的代码稍微复杂一些。看看以前的版本,看看我真的在做什么。 – 2010-05-28 13:19:05

+0

这与'foreach'是一样的。 – 2010-05-28 13:24:24

+0

不仅它和foreach是一样的,而且在值和引用类型之间。 http://*.com/questions/235455/access-to-modified-closure我只花了一天的更好的一部分,试图调试其中之一,直到一位同事指出我的错误。 – 2011-06-09 20:55:44