Aşağıdaki iki snippet'te, birincisi güvenli mi yoksa ikincisini mi yapmalısınız?Foreach tanımlayıcısı ve kapatır
Güvenli bir şekilde, her bir iş parçacığının, iş parçacığının oluşturulduğu aynı döngü yinelemesinden Foo'daki yöntemi çağırması garanti edilir.
Veya referansı, döngüdeki her yineleme için "yerel" yeni bir değişkene kopyalamanız gerekir mi?
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();
}
Güncelleme: olarak Jon Skeet yanıtında işaret, bu özel parçacığı ile ilgisi yoktur. aynı referansa
Aslında iş parçacığı kullanmıyormuşsunuz gibi düşünmek zorunda olduğumu hissediyorum, doğru delege çağırırsınız. Jon Skeet'in iş parçacığı olmadan yaptığı örnekte sorun, 2 döngü olduğu. Burada sadece bir tane var, bu yüzden bir sorun olmamalı ... kodun ne zaman işleyeceğini tam olarak bilmedikçe (iş parçacığı kullanırsanız - Marc Gravell'in cevabı mükemmel olduğunu gösterir). – user276648
[Değiştirilmiş Kapanış Erişim (2)] 'nin olası kopyası (http://stackoverflow.com/questions/304258/access-to-modified-closure-2) – nawfal
@ user276648 İş parçacığı gerektirmez. Döngülerin yürütülmesini ertelemek, bu davranışı elde etmek için yeterli olacaktır. – binki