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(); }
Cependant, dans un environnement multithread, cette approche peut conduire à une situation de concurrence critique. Voici comment cela peut se produire :
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); }
Cette approche est thread-safe car :
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!