2012-03-08 151 views
6

this後,我被告知,下面的代碼段遭受「關閉循環變量的令人震驚的行爲」。關閉在C循環變量#

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

     newThread.Start(); 
    } 

我把它切換到這一點:

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

      newThread.Start(); 
     } 

但我的老闆一直堅持認爲它會從同樣的問題受到影響。我用this鏈接來嘗試解決這個問題。有人可以幫助我正確地解決問題,以便我的代碼能夠正確執行。這個問題對我來說都是新的,我不確定我是否完全理解它。

+17

你的老闆是錯的。 – 2012-03-08 22:28:35

+16

並有尖尖的頭髮。 – 2012-03-08 22:29:11

+0

任何人都可以解釋這是爲什麼嗎?我不知道我完全理解它。這兩者之間的區別究竟是什麼,因爲他們看起來像是在做同樣的事情。但是,當我運行它時,我知道它們不是。 – user489041 2012-03-08 22:33:00

回答

4

關閉變量,以後更改值是什麼導致問題。

  • candidate改變每一個「圈」,圍繞環和引起問題。
  • can是在環路周圍新建立的每個「圈」,從不改變,並且不會造成問題。
+0

所以它失敗了,因爲候選人每改變一個「圈」,當線程實際執行時,它可能是當前候選值。由於循環很可能在線程啓動之前完成,它通常是候選列表中的最後一項? – user489041 2012-03-08 22:46:58

+0

@ user489041準確地說,它會得到當前值,而不是它在包裝時的值。一個不變的變量將會保持它的值(根據定義)並且不會引起問題,這就是爲什麼在循環中創建一個新變量將解決這個問題,它將超出範圍並被重新創建而不是被改變。 – 2012-03-08 22:57:26