Закрытие по переменной Loop в C # - PullRequest
6 голосов
/ 09 марта 2012

С этой записи мне сказали, что следующий раздел кода страдал от "вопиющего акта закрытия переменной цикла".

    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();
        }

Но мой начальник настаивает на том, что он будет страдать от тех же проблем. Я использовал эту ссылку, чтобы попытаться решить эту проблему. Может кто-нибудь помочь мне правильно решить проблему, чтобы мой код выполнялся правильно. этот вопрос для меня совершенно новый, и я не уверен, что полностью его понимаю.

1 Ответ

4 голосов
/ 09 марта 2012

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

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