Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengelakkan Keadaan Perlumbaan Apabila Menghantar Acara dalam C#?

Bagaimana untuk Mengelakkan Keadaan Perlumbaan Apabila Menghantar Acara dalam C#?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-03 17:03:41231semak imbas

How to Avoid Race Conditions When Dispatching Events in C#?

Keadaan Perlumbaan dalam Penghantaran Acara

Acara dalam C# selalunya dihantar menggunakan kod berikut:

public event EventHandler SomeEvent;
...
{
    ....
    if(SomeEvent!=null)SomeEvent();
}

Walau bagaimanapun, dalam persekitaran berbilang benang, pendekatan ini boleh membawa kepada keadaan perlumbaan. Begini cara ia boleh berlaku:

  1. Thread 1 menyemak sama ada SomeEvent bukan batal.
  2. Thread 2 mengalih keluar satu-satunya perwakilan berdaftar daripada SomeEvent.
  3. Thread 1 diteruskan ke gunakan SomeEvent, yang menyebabkan pengecualian disebabkan oleh panggilan batal senarai.

Untuk menangani isu konkurensi ini, amalan terbaik ialah menyalin senarai invokasi kepada pembolehubah sementara sebelum menyemak nol:

protected virtual void OnSomeEvent(EventArgs args) 
{
    EventHandler ev = SomeEvent;
    if (ev != null) ev(this, args);
}

Pendekatan ini selamat untuk benang kerana:

  • Delegate.Combine and Delegate.Alih keluar kembalikan perwakilan baharu dan bukannya mengubah suai sedia ada satu.
  • Penugasan rujukan objek dalam .NET adalah atom.
  • Aksesori acara (tambah/buang) disegerakkan.

Dengan menyalin senarai seruan, kami memastikan bahawa pengendali acara dipanggil walaupun mereka dialih keluar selepas salinan diambil. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa penyelesaian ini tidak menangani isu keadaan yang berpotensi dengan pengendali acara yang tidak berfungsi.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Keadaan Perlumbaan Apabila Menghantar Acara dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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