W dwóch poniższych fragmentach pierwszy z nich jest bezpieczny lub czy należy wykonać drugi?Identyfikator foreach i zamknięcia
Czy to bezpieczne, że każdy wątek gwarantuje wywołanie metody na Foo z tej samej iteracji pętli, w której wątek został utworzony?
Czy trzeba skopiować referencję do nowej zmiennej "local" do każdej iteracji pętli?
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();
}
Aktualizacja: Jak wskazano w odpowiedzi Jon Skeet, ten nie ma nic wspólnego ze specjalnie gwintowania.
Właściwie uważam, że ma to związek z wątkami, tak jakbyś nie korzystał z wątków, nazwałbyś właściwego delegata. W próbce Jona Skeeta bez wątków, problem polega na tym, że istnieją 2 pętle. Tutaj jest tylko jeden, więc nie powinno być problemu ... chyba że nie wiesz dokładnie, kiedy kod zostanie wykonany (co oznacza, że jeśli używasz wątków - odpowiedź Marc Gravell pokazuje to doskonale). – user276648
możliwy duplikat [Dostęp do zmodyfikowanego zamknięcia (2)] (http://stackoverflow.com/questions/304258/access-to-modified-closure-2) – nawfal
@ user276648 Nie wymaga gwintowania. Odroczenie wykonania delegatów, dopóki pętla nie wystarczy, aby uzyskać to zachowanie. – binki