В двух следующих фрагментах, является первым безопасным или вы должны сделать второй?Идентификатор и замыкания foreach
Я уверен, что каждый поток гарантированно вызывает метод на Foo из той же итерации цикла, в которой был создан поток?
Или вы должны скопировать ссылку на новую переменную «local» на каждую итерацию цикла?
var threads = new List<Thread>();
foreach (Foo f in ListOfFoo)
{
Thread thread = new Thread(() => f.DoSomething());
threads.Add(thread);
thread.Start();
}
-
var threads = new List<Thread>();
foreach (Foo f in ListOfFoo)
{
Foo f2 = f;
Thread thread = new Thread(() => f2.DoSomething());
threads.Add(thread);
thread.Start();
}
Update: Как указано в ответе Джона Скита, это не имеет ничего специально делать с резьбой.
На самом деле, я чувствую, что он имеет дело с потоками, как если бы вы не использовали потоки, вы бы назвали нужным делегатом. В примере с Джоном Скитом без потоковой обработки проблема состоит в том, что существует 2 цикла. Вот только один, поэтому не должно быть никаких проблем ... если вы точно не знаете, когда будет выполняться код (что означает, что если вы используете потоки - ответ Марка Гравелла показывает, что это прекрасно). – user276648
Возможный дубликат [Доступ к измененному закрытию (2)] (http://stackoverflow.com/questions/304258/access-to-modified-closure-2) – nawfal
@ user276648 Он не требует потоковой передачи. Отложите выполнение делегатов до тех пор, пока цикл не будет достаточным для получения этого поведения. – binki