2012-03-08 16 views
6

Desde la publicación this, me dijeron que la siguiente sección de código sufría de "el atroz acto de cerrar la variable de ciclo".Cerrando la Variable de Ciclo en C#

foreach (Canidate canidate in allCanidates) 
    { 
     Thread newThread = new Thread(delegate() 
     { 
      BusyWait(canidate); 
     }); 

     newThread.Start(); 
    } 

cambié a esto:

foreach (Canidate canidate in allCanidates) 
     { 
      var can = canidate; 
      Thread newThread = new Thread(delegate() 
      {     
       BusyWait(can); 
      }); 

      newThread.Start(); 
     } 

Pero mi jefe sigue insistiendo en que va a sufrir los mismos problemas. Usé el enlace this para tratar de resolver este problema. ¿Alguien puede ayudarme a resolver el problema correctamente para que mi código se ejecute correctamente? este problema es nuevo para mí, y no estoy seguro de entenderlo por completo.

+17

Su jefe está equivocado. –

+16

Y tiene el pelo puntiagudo. –

+0

¿Alguien puede explicar por qué es eso? No estoy seguro de entenderlo completamente. Cuál es exactamente la diferencia entre los dos, porque a mí me parece que están haciendo exactamente lo mismo. Sin embargo, cuando lo ejecuto, sé que no lo son. – user489041

Respuesta

4

El problema de las variables que posteriormente cambian de valores es lo que causa el problema.

  • candidate cambia cada "vuelta" alrededor del bucle y voluntad causan problemas.
  • can se acaba de crear cada "vuelta" alrededor del ciclo, nunca cambia, y no causará problemas.
+0

Por lo tanto, falla porque el candidato cambia cada "vuelta", que cuando el hilo se ejecuta realmente, podría ser cualquier valor candidato actualmente. Y dado que el ciclo probablemente finalizó antes de que comience el hilo, ¿suele ser el último elemento en la lista de candidatos? – user489041

+0

@ user489041 Exactamente, obtendrá el valor actual, no el valor que tenía cuando se envolvió. Una variable que no cambia mantendrá su valor (por definición) y no causará problemas, por eso crear una nueva variable en el ciclo resolverá la situación, saldrá del alcance y se creará de nuevo en lugar de cambiarse. –

Cuestiones relacionadas