Rumah > pembangunan bahagian belakang > C++ > Adakah Menggunakan Pembolehubah `foreach` Secara Terus dalam Penutupan Berbilang Benang C# Selamat?

Adakah Menggunakan Pembolehubah `foreach` Secara Terus dalam Penutupan Berbilang Benang C# Selamat?

Barbara Streisand
Lepaskan: 2025-01-22 06:56:12
asal
736 orang telah melayarinya

Is Using the `foreach` Variable Directly in C# Multi-threaded Closures Safe?

foreach Pembolehubah dan penutupan berbilang benang dalam C#: Adakah ia selamat?

Apabila menggunakan foreach untuk menggelungkan koleksi dalam C#, adalah penting untuk memahami skop dan gelagat pembolehubah lelaran, terutamanya dalam persekitaran berbilang benang.

Coretan kod berikut meneroka sama ada selamat untuk menggunakan foreach pembolehubah secara langsung sebagai hujah penutupan dalam berbilang benang dan sama ada salinan setempat perlu dibuat untuk setiap lelaran.

Pra-C# 5 versi

Dalam versi sebelum C# 5, foreach pembolehubah telah diisytiharkan di luar gelung. Ini bermakna bahawa satu contoh pembolehubah dikongsi merentas semua lelaran.

Pertimbangkan coretan kod pertama:

foreach (Foo f in ListOfFoo)
{      
    Thread thread = new Thread(() => f.DoSomething());
    threads.Add(thread);
    thread.Start();
}
Salin selepas log masuk

Dalam contoh ini, pembolehubah f dikongsi antara semua urutan yang dibuat semasa lelaran gelung. Ini boleh membawa kepada hasil yang tidak dapat diramalkan, kerana berbilang urutan mungkin akhirnya memanggil kaedah pada kejadian Foo yang berbeza, atau kaedah memanggil pada tika yang sama beberapa kali.

Untuk mengelakkan masalah sedemikian, adalah disyorkan untuk membuat salinan setempat pembolehubah f dalam setiap lelaran, seperti yang ditunjukkan dalam coretan kod kedua:

foreach (Foo f in ListOfFoo)
{      
    Foo f2 = f;
    Thread thread = new Thread(() => f2.DoSomething());
    threads.Add(thread);
    thread.Start();
}
Salin selepas log masuk

C# 5 dan ke atas

C# 5 memperkenalkan perubahan ketara. Dalam C# 5 dan ke atas, foreach pembolehubah ditakrifkan dalam skop gelung. Ini bermakna setiap lelaran mempunyai contoh pembolehubahnya sendiri.

Oleh itu, dua coretan kod menjadi setara dan selamat. Setiap rangkaian kini mempunyai contoh f tersendiri dalam skop penutupannya, menghapuskan risiko kekeliruan atau ketidakkonsistenan.

Atas ialah kandungan terperinci Adakah Menggunakan Pembolehubah `foreach` Secara Terus dalam Penutupan Berbilang Benang C# Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan