Maison > développement back-end > C++ > Comment éviter les conditions de concurrence lors de la distribution d'événements en C# ?

Comment éviter les conditions de concurrence lors de la distribution d'événements en C# ?

Mary-Kate Olsen
Libérer: 2025-01-03 17:03:41
original
218 Les gens l'ont consulté

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

Condition de concurrence dans la répartition des événements

Un événement en C# est souvent distribué à l'aide du code suivant :

public event EventHandler SomeEvent;
...
{
    ....
    if(SomeEvent!=null)SomeEvent();
}
Copier après la connexion

Cependant, dans un environnement multithread, cette approche peut conduire à une situation de concurrence critique. Voici comment cela peut se produire :

  1. Le fil de discussion 1 vérifie si SomeEvent n'est pas nul.
  2. Le fil de discussion 2 supprime le seul délégué enregistré de SomeEvent.
  3. Le fil de discussion 1 passe à invoquez SomeEvent, ce qui provoque une exception en raison de la liste d'invocation nulle.

Pour répondre Pour résoudre ce problème de concurrence, une bonne pratique consiste à copier la liste d'appel dans une variable temporaire avant de rechercher null :

protected virtual void OnSomeEvent(EventArgs args) 
{
    EventHandler ev = SomeEvent;
    if (ev != null) ev(this, args);
}
Copier après la connexion

Cette approche est thread-safe car :

  • Déléguer. Combine et Delegate.Remove renvoient de nouvelles instances de délégué au lieu de modifier celles existantes.
  • L'attribution de références d'objet dans .NET est atomique.
  • Les accesseurs d'événements (ajout/suppression) sont synchronisés.

En copiant la liste d'invocation, nous nous assurons que les gestionnaires d'événements sont invoqués même s'ils sont supprimés après la copie est pris. Cependant, il est important de noter que cette solution ne résout pas les problèmes d'état potentiels avec les gestionnaires d'événements défunts.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal