SORU
4 ŞUBAT 2009, ÇARŞAMBA


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
4 ŞUBAT 2009, ÇARŞAMBA


İ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)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EmperorTigerstar

    EmperorTiger

    14 EYLÜL 2009
  • jkimisyellow

    jkimisyellow

    6 Mayıs 2009
  • PaulGBelliveau

    PaulGBellive

    5 Mart 2009