Sécurité de la répartition des événements dans les environnements multithread
Dans un environnement multithread, l'approche recommandée pour la répartition des événements consiste à vérifier la nullité de l'événement avant l'invocation. Cependant, cela soulève des inquiétudes quant à la potentielle condition de concurrence critique dans laquelle un autre thread modifie la liste d'invocation entre la vérification nulle et l'appel d'événement.
Pour répondre à ce problème, la solution suggérée consiste à créer une méthode virtuelle protégée pour l'événement, comme indiqué ci-dessous :
protected virtual void OnSomeEvent(EventArgs args) { EventHandler ev = SomeEvent; if (ev != null) ev(this, args); }
Cette méthode garantit la sécurité des threads en copiant le délégué de multidiffusion de l'événement vers une variable temporaire. Toute modification ultérieure de l'événement n'affectera pas le délégué copié, ce qui permettra des tests et des invocations en toute sécurité.
Cependant, cette solution ne résout que la condition de concurrence liée aux événements nuls. Il ne gère pas les situations dans lesquelles les gestionnaires d'événements font référence à un état non valide ou s'abonnent après la copie. Pour des solutions complètes aux problèmes de simultanéité des événements, il est recommandé de consulter des ressources externes telles que le billet de blog d'Eric Lippert et la question StackOverflow référencée.
Dans les environnements C# 6.0, l'utilisation de l'approche de Krzysztof peut améliorer encore la sécurité de la répartition des événements.
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!