2012-03-08 1 views
6

От this сообщение, мне сказали, что следующий раздел кода страдает от «вопиющего акта закрытия по переменной цикла».Закрытие переменной Loop в 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

Ваш босс ошибочен. –

+16

И имеет острые волосы. –

+0

Может ли кто-нибудь объяснить, почему это так? Я не уверен, что полностью понимаю это. В чем же разница между этими двумя, потому что мне кажется, что они делают то же самое. Однако, когда я запускаю его, я знаю, что это не так. – user489041

ответ

4

Закрытие переменных, которые впоследствии меняют значения, является причиной проблемы.

  • candidate меняется каждый «круг» вокруг петли и воли проблемы вызывают.
  • can вновь создан каждый «круг» вокруг цикла, никогда не изменяется, и не будет вызывать проблемы.
+0

Таким образом, он терпит неудачу, потому что, поскольку кандидат меняет каждый «круг» вокруг, что, когда поток фактически выполняется, он может быть любым кандидатом на значение в настоящее время. И поскольку цикл, скорее всего, завершился до начала потока, это, как правило, последний элемент в списке кандидатов? – user489041

+0

@ user489041 Точно, он получит текущее значение, а не значение, которое оно имело, когда оно было завернуто. Не изменяющаяся переменная будет сохранять свое значение (по определению) и не вызывать проблем, поэтому создание новой переменной в цикле решит ситуацию, оно выйдет за рамки и будет создано снова, а не изменено. –