En los dos fragmentos siguientes, ¿es seguro el primero o debe hacer el segundo?El identificador de foreach y cierres
Con seguridad quiero decir que cada hilo garantiza llamar al método en el Foo desde la misma iteración de bucle en la que se creó el subproceso?
¿O debe copiar la referencia a una nueva variable "local" en cada iteración del ciclo?
var threads = new List<Thread>();
foreach (Foo f in ListOfFoo)
{
Thread thread = new Thread(() => f.DoSomething());
threads.Add(thread);
thread.Start();
}
-
var threads = new List<Thread>();
foreach (Foo f in ListOfFoo)
{
Foo f2 = f;
Thread thread = new Thread(() => f2.DoSomething());
threads.Add(thread);
thread.Start();
}
Actualización: Como se señaló en la respuesta de Jon Skeet, esto no tiene nada que ver específicamente con rosca.
En realidad, creo que tiene que ver con el enhebrado como si no estuvieras usando el enhebrado, llamarías al delegado correcto. En la muestra de Jon Skeet sin enhebrar, el problema es que hay 2 bucles. Aquí hay solo uno, por lo que no debería haber ningún problema ... a menos que no se sepa exactamente cuándo se ejecutará el código (es decir, si usa el enhebrado, la respuesta de Marc Gravell lo muestra perfectamente). – user276648
posible duplicado de [Acceso al cierre modificado (2)] (http://stackoverflow.com/questions/304258/access-to-modified-closure-2) – nawfal
@ user276648 No es necesario enhebrar. Aplazar la ejecución de los delegados hasta después del ciclo sería suficiente para obtener este comportamiento. – binki