Dosyalarda grup için tanımlayıcı ve kapanışları
İki aşağıdaki parçacıkları, ilk güvenli ya da ikinci bir yapmak zorunda mısın?
Güvenli tarafından her iş parçacığının iş parçacığı oluşturuldu aynı döngü yineleme from Foo metodu çağırmak için garanti değil mi?
Ya da yeni bir değişken için başvuru kopyasını gerekir "Yerel" her yineleme döngü?
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:Jon Skeet cevap olarak belirttiği gibi, bu iş parçacığı ile yapmak için özel bir şey yok.
CEVAP
İkinci güvenlidir; bu ilk değil.
foreach
ile değişken bildirildidışarıdabu döngü yani
Foo f;
while(iterator.MoveNext())
{
f = iterator.Current;
// do something with f
}
Bu demektir ki orada sadece 1 f
açısından kapatılması kapsam ve konuları belki çok büyük olasılıkla karışıyor - arama yöntemi birden çok kez bazı örneklerini ve Tüm Diğerleri. İkinci değişken bir bildiri ile bu durumu düzeltebilirsiniçindedöngü:
foreach(Foo f in ...) {
Foo tmp = f;
// do something with tmp
}
Bu daha sonra tmp
Her kapatılması ayrı bir kapsamı vardır, bu konuda risk yok.
İşte bu sorunun basit bir kanıt
static void Main()
{
int[] data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
foreach (int i in data)
{
new Thread(() => Console.WriteLine(i)).Start();
}
Console.ReadLine();
}
Çıktıları (rasgele):
1
3
4
4
5
7
7
8
9
9
Geçici bir değişken Ekle ve çalışır:
foreach (int i in data)
{
int j = i;
new Thread(() => Console.WriteLine(j)).Start();
}
her sayı bir kez, ama elbette sırası garanti değil)
C için bir sebep mi'#; dosyalarda ...
.Döngü daha hızlı çalışır NET,' v...
Nasıl dosyalarda grup dizini bulmak iç...
'' Paralel devam etmek için ...
nasıl Javascript dosyalarda grup durdu...