Cerating de l'extension de la méthode comme celle proposée ne résout pas vraiment les problèmes avec des conditions de course, mais plutôt de le cacher.
public static void SafeInvoke(this EventHandler handler, object sender)
{
if (handler != null) handler(sender, EventArgs.Empty);
}
Comme l'a déclaré ce code est l'élégant équivalent à la solution avec la variable temporaire, mais...
Le problème avec la fois que c'est possible que subsciber de l'événement pourrait être appelée APRÈS qu'il a désabonné de l'événement. Cela est possible parce que le désabonnement peut se produire après l'instance de délégué est copié dans la variable temp (ou transmise en tant que paramètre à la méthode ci-dessus), mais devant le délégué est invoquée.
En général, le comportement du code du client est imprévisible dans ce cas: état des composants ne pouvait pas permettre de manipuler la notification d'événements déjà. Il est possible d'écrire un code client dans la façon de le gérer, mais il serait mis unnecesssary la responsabilité du client.
La seule façon connue d'assurer fil safity est l'utilisation de lock déclaration de l'expéditeur de l'événement. Cela garantit que tous les abonnements\désinscriptions\invocation sont sérialisés.
Pour être plus précis verrouillage doit être appliquée de la même synchronisation de l'objet utilisé dans ajout / suppression de l'événement méthodes accesseur qui est la valeur par défaut 'cette'.