2012-03-08 8 views
6

Dal this post, mi è stato detto che la seguente sezione di codice ha sofferto "dell'atto egregio di chiusura sulla variabile del ciclo".Closing over the Loop Variable in C#

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

     newThread.Start(); 
    } 

sono passato a questo:

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

      newThread.Start(); 
     } 

Ma il mio capo continua a insistere che soffrirà gli stessi problemi. Ho usato il link this per cercare di risolvere questo problema. Qualcuno può aiutarmi a risolvere correttamente il problema in modo che il mio codice verrà eseguito correttamente. questo problema è tutto nuovo per me, e non sono sicuro di averlo capito appieno.

+17

Il tuo capo ha torto. –

+16

E ha i capelli a punta. –

+0

Qualcuno può spiegare perché è così? Non sono sicuro di averlo capito appieno. Qual è esattamente la differenza tra i due, perché a me sembra che stiano facendo esattamente la stessa cosa. Tuttavia, quando lo eseguo, so che non lo sono. – user489041

risposta

4

Chiudere le variabili che successivamente modificano i valori è ciò che sta causando il problema.

  • candidate cambia ogni "giro" in giro per il ciclo e sarà causare problemi.
  • can è appena creato ogni "giro" intorno al ciclo, non cambia mai e non causa problemi.
+0

Quindi fallisce perché dal momento che il candidato cambia ogni "giro" attorno a quello, quando il thread viene effettivamente eseguito, potrebbe essere qualsiasi valore candidato al momento. E poiché il ciclo probabilmente ha finito prima dell'inizio del thread, di solito è l'ultimo elemento nell'elenco dei candidati? – user489041

+0

@ user489041 Esattamente, otterrà il valore corrente, non il valore che aveva quando è stato incartato. Una variabile non variabile manterrà il suo valore (per definizione) e non causerà problemi, per questo la creazione di una nuova variabile nel ciclo risolverà la situazione, andrà fuori campo e verrà creata nuovamente anziché modificata. –