Assurer la sécurité des threads lors de la répartition des événements avec des vérifications nulles
Lorsque vous travaillez dans des environnements multithread, il est crucial de s'assurer que les threads n'interfèrent pas entre eux tout en effectuant des opérations délicates. L'une de ces opérations est la répartition d'événements, qui peut impliquer la vérification de la valeur NULL avant d'appeler les écouteurs d'événement.
L'approche recommandée pour la répartition des événements implique la vérification de la valeur NULL comme suit :
public event EventHandler SomeEvent; ... { .... if(SomeEvent!=null)SomeEvent(); }
Cependant, en multi -threaded, un scénario peut survenir dans lequel un autre thread modifie la liste d'invocation de SomeEvent entre la vérification nulle et l'invocation réelle de l'événement. Cela peut entraîner des exceptions ou un comportement inattendu.
Pour résoudre ce problème de sécurité des threads, une technique couramment utilisée consiste à faire une copie du délégué de multidiffusion SomeEvent avant d'effectuer la vérification nulle. Cela se fait à l'aide d'une méthode virtuelle protégée, comme indiqué ci-dessous :
protected virtual void OnSomeEvent(EventArgs args) { EventHandler ev = SomeEvent; if (ev != null) ev(this, args); }
Cette technique garantit que toute modification apportée à SomeEvent après la copie n'affectera pas la copie du délégué qui est invoquée.
Cependant, il est important de noter que cette solution ne résout que le problème des gestionnaires d'événements nuls. Il ne gère pas les cas où les gestionnaires d'événements disparaissent après leur ajout ou où les gestionnaires d'événements s'abonnent après la copie.
Pour une approche plus complète de la gestion des conditions de concurrence dans la répartition des événements, envisagez d'utiliser Interlocked.CompareExchange ou explorer les fonctionnalités de C# 6.0 telles que les délégués anonymes et les primitives de synchronisation des threads.
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!