Mengalami "Koleksi Modified: Operasi Penghitungan Mungkin Gagal" Kesalahan
Koleksi ralat "telah diubah suai; operasi penghitungan tidak boleh dilaksanakan" timbul apabila koleksi diubah semasa diulang, yang membawa kepada tingkah laku yang tidak dapat diramalkan. Ini biasanya berlaku dalam senario multithreaded di mana pelbagai benang mengakses dan mengubahsuai koleksi yang sama serentak.Ralat khusus ini ditunjukkan dalam kaedah
, di mana kamus NotifySubscribers()
diakses dalam gelung subscribers
. Pengubahsuaian serentak ke kamus ini (mis., Langganan klien atau tidak langganan) Membatalkan penghitungan. foreach
Penyelesaian: Melaksanakan Keselamatan Thread
Untuk menyelesaikannya, keselamatan benang untuk kamus adalah penting. Dua pendekatan disyorkan: subscribers
Menggunakan : ConcurrentDictionary
Gantikan kamus standard dengan . Struktur data ini sememangnya selamat benang, menghalang kesilapan. ConcurrentDictionary<TKey, TValue>
Mewujudkan salinan untuk lelaran: Sebelum gelung , buat salinan nilai kamus foreach
menggunakan subscribers
. Ini mewujudkan gambar yang tidak terjejas oleh pengubahsuaian berikutnya kepada kamus asal, memastikan penghitungan yang selamat. subscribers.Values.ToList()
Contoh kod:
inilah kaedah yang diubahsuai untuk menggunakan NotifySubscribers()
: ConcurrentDictionary
<code class="language-csharp">public void NotifySubscribers(DataRecord sr) { foreach (Subscriber s in subscribers.Values) // subscribers is now a ConcurrentDictionary { try { s.Callback.SignalData(sr); } catch (Exception e) { DCS.WriteToApplicationLog(e.Message, System.Diagnostics.EventLogEntryType.Error); UnsubscribeEvent(s.ClientId); } } }</code>
untuk membuat salinan selamat: ToList()
<code class="language-csharp">public void NotifySubscribers(DataRecord sr) { foreach (Subscriber s in subscribers.Values.ToList()) { try { s.Callback.SignalData(sr); } catch (Exception e) { DCS.WriteToApplicationLog(e.Message, System.Diagnostics.EventLogEntryType.Error); UnsubscribeEvent(s.ClientId); } } }</code>
Atas ialah kandungan terperinci Bagaimana untuk mengendalikan 'koleksi telah diubah suai; operasi penghitungan tidak boleh melaksanakan' kesilapan dalam persekitaran multithreaded?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!