Keselamatan Berbilang Thread bagi Penghantaran Acara dengan Pemeriksaan Null
Dalam pengaturcaraan berasaskan acara, acara membenarkan objek berbeza berkomunikasi dan bertindak balas terhadap kejadian tertentu. Adalah amalan biasa untuk menghantar acara menggunakan semakan nol pada perwakilan pengendali acara, seperti yang dilihat di bawah:
public event EventHandler SomeEvent; ... { .... if(SomeEvent!=null)SomeEvent(); }
Walau bagaimanapun, dalam persekitaran berbilang benang, terdapat kemungkinan keadaan perlumbaan di mana urutan lain boleh mengubah suai senarai panggilan acara antara semakan nol dan seruan. Ini boleh mengakibatkan pengecualian atau tingkah laku yang salah.
Menangani Isu Berbilang Thread
Untuk mengurangkan perkara ini, adalah disyorkan untuk menetapkan wakil pengendali acara kepada pembolehubah setempat dalam acara kaedah penghantaran, seperti yang ditunjukkan di bawah:
protected virtual void OnSomeEvent(EventArgs args) { EventHandler ev = SomeEvent; if (ev != null) ev(this, args); }
Dengan melakukan ini, sebarang tindakan seterusnya pengubahsuaian pada senarai pengendali acara SomeEvent tidak akan menjejaskan salinan yang disimpan dalam pembolehubah ev. Ini memastikan acara akan digunakan dengan betul, walaupun senarai pengendali acara berubah dalam masa yang sama.
Adalah penting untuk ambil perhatian bahawa penyelesaian ini hanya menangani satu aspek pengendalian acara berbilang benang. Ia tidak mengambil kira sepenuhnya pengendali acara yang tidak berfungsi atau pengendali acara yang melanggan selepas salinan diambil. Untuk panduan komprehensif tentang amalan terbaik dalam bidang ini, rujuk entri blog Eric Lippert dan perbincangan StackOverflow mengenai topik tersebut.
Atas ialah kandungan terperinci Bagaimana untuk Memastikan Keselamatan Berbilang Benang Apabila Menghantar Acara dengan Pemeriksaan Null?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!