Heim >Backend-Entwicklung >C++ >Wie vermeide ich Race Conditions beim Versenden von Ereignissen in C#?

Wie vermeide ich Race Conditions beim Versenden von Ereignissen in C#?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-03 17:03:41214Durchsuche

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

Race Condition in Event Dispatching

Ein Ereignis in C# wird oft mit dem folgenden Code versendet:

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

In einer Multithread-Umgebung kann dieser Ansatz jedoch zu einer Race-Bedingung führen. So kann es passieren:

  1. Thread 1 prüft, ob SomeEvent nicht null ist.
  2. Thread 2 entfernt den einzigen registrierten Delegaten von SomeEvent.
  3. Thread 1 fährt mit fort Rufen Sie SomeEvent auf, was aufgrund der Null-Aufrufliste eine Ausnahme verursacht.

Um dieses Problem zu beheben Bei Parallelitätsproblemen besteht eine bewährte Vorgehensweise darin, die Aufrufliste vor der Prüfung auf Null in eine temporäre Variable zu kopieren:

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

Dieser Ansatz ist threadsicher, weil:

  • Delegate.Combine und Delegate.Remove geben neue Delegate-Instanzen zurück, anstatt vorhandene zu ändern.
  • Zuweisung von Objektreferenzen in .NET ist atomar.
  • Die Ereigniszugriffsfunktionen (Hinzufügen/Entfernen) werden synchronisiert.

Durch das Kopieren der Aufrufliste stellen wir sicher, dass die Ereignishandler aufgerufen werden, auch wenn sie nach dem Kopieren entfernt werden wird genommen. Es ist jedoch wichtig zu beachten, dass diese Lösung potenzielle Zustandsprobleme mit nicht mehr funktionierenden Ereignishandlern nicht behebt.

Das obige ist der detaillierte Inhalt vonWie vermeide ich Race Conditions beim Versenden von Ereignissen in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn