2010-05-27 22 views
6

sé por las actuales directivas codeing que he leído que no debe hacerForeach bucle y tareas

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

ya que escribirá 5 5 de, entiendo eso y creo que entiendo por qué está sucediendo. Sé que la solución es solo hacer

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

Sin embargo, algo como esto está bien hacer?

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

¿O tengo que hacer lo mismo que hice en el ciclo for.

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

Respuesta

6

Es absolutamente el mismo problema con foreach. En el siguiente:

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

será más probable que siempre invocar el método DoAction en el último elemento de la lista, que podría ser fijado de esta manera:

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

Pero en lugar de depender de variables locales que se lo recomendaría usted lo siguiente:

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

realmente no importa el caso de, he copiado el código de http://download.microsoft.com/download/B/C/F/BCFD4868-1354-45E3 -B71B-B851CD78733D/ParallelPrograms inNET4_CodingGuidelines.pdf Realmente solo quiero saber sobre el caso Foreach. Además, mi código es un poco más complicado de lo que publiqué. mira la revisión anterior para ver lo que realmente estoy haciendo. –

+0

Es lo mismo con 'foreach'. –

+0

Y no solo es lo mismo entre for y foreach, sino entre value y reference types. http://stackoverflow.com/questions/235455/access-to-modified-closure Acabo de pasar la mayor parte del día intentando depurar uno de estos hasta que un colega me señaló mi error. –