2010-05-27 8 views
6

je sais que des guidlines de codeing que j'ai lu, vous ne devriez pas faireboucle Foreach et les tâches

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

comme il rédigera 5 5 de, je comprends et je pense que je comprends pourquoi cela se produit. Je sais que la solution est juste de faire

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

Cependant, quelque chose comme ça est ok à faire?

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

Ou dois-je faire la même chose que j'ai fait dans la boucle for.

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

Répondre

6

Il est tout à fait le même problème avec foreach. Ce qui suit:

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

sera plus invoquera probablement toujours la méthode doAction le dernier élément de la liste, qui pourrait être fixé comme ceci:

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

Mais au lieu de compter sur les variables locales, je recommanderais vous les éléments suivants:

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

Je ne me soucie pas vraiment du cas pour, je viens de copier le code de http://download.microsoft.com/download/B/C/F/BCFD4868-1354-45E3 -B71B-B851CD78733D/ParallelPrograms inNET4_CodingGuidelines.pdf Je veux juste juste savoir à propos de l'affaire foreach. Aussi mon code est un peu plus compliqué que ce que j'ai posté. regarde la révision précédente pour voir ce que je fais vraiment. –

+0

C'est la même chose avec 'foreach'. –

+0

Et non seulement est-il le même entre for et foreach, mais entre la valeur et les types de référence. http://stackoverflow.com/questions/235455/access-to-modified-closure Je viens de passer une bonne partie de la journée à essayer de déboguer l'un d'eux jusqu'à ce qu'un collègue me signale mon erreur. –