2012-08-25 2 views
0

Je voudrais confirmer quelque chose - quand j'enregistrer une méthode en tant qu'abonné à un événement le long chemin, comme ceci:Différence entre l'enregistrement et l'enregistrement délégué méthode nommée pour l'événement

_serviceContext.ReadingEntity += new EventHandler<ReadingWritingEntityEventArgs>(_serviceContext_ReadingEntity); 

Je dois ONU- inscrire cette méthode de l'abonnement de l'événement si je ne veux pas continuer à être appelé quand est tiré, comme celui-ci l'événement:

_serviceContext.ReadingEntity -= new EventHandler<ReadingWritingEntityEventArgs>(_serviceContext_ReadingEntity); 

quand j'enregistrer un délégué en tant qu'abonné à un événement, comme suit:

public guy ThisMethod() 
{ 
    _serviceContext.ReadingEntity += delegate(object sender, ReadingWritingEntityEventArgs e) 
     { 

     }; 
} 

Il n'existe aucun moyen de désinscrire ce délégué de la liste d'abonnés de cette méthode. Je suppose donc que la portée de cet enregistrement est limitée à la méthode dans laquelle il est enregistré - ie si l'événement _serviceContext.ReadingEntity a été déclenché dans une méthode appelée par ThisMethod, cet enregistrement serait déjà expiré et le code dans le délégué ne serait pas courir. Est-ce correct?

Merci!

p.s. Je me rends compte que la première "longue" façon d'enregistrer un gestionnaire d'événements a également des limites de portée, mais je suis un peu flou sur ce point. Ma question principale, cependant, est de savoir si oui ou non l'inscription du délégué se déroulera en dehors de la méthode ci-dessus.

Répondre

1

Une fois que vous avez souscrit un délégué de cette façon (vous pouvez résilier votre abonnement en utilisant l'opérateur -= si vous mettez en cache la variable représentant quelque part) vous ne pouvez pas l'enlever de la liste des abonnés et sera être invoqué chaque événement temps augmente jusqu'à ce que l'éditeur est vivant . De plus cet abonnement empêchera toute classe d'abonné (classe qui contient la méthode que vous avez souscrite à l'événement) de récupérer la place jusqu'à ce que l'éditeur soit actif (sauf si vous utilisez une méthode statique).

Pour plus de clarté, il n'y a pas de méthodes "anonymes" dans le code IL. Tous vos délégués et lamdbas sont traduits en méthodes static/instance et en classes de fermeture (selon qu'ils utilisent des membres/paramètres de fonction).

1

Vous pouvez vous désabonner d'un délégué si vous y conservez une référence.

EventHandler<ReadingWritingEntityEventArgs> aDelegate = delegate(object sender, ReadingWritingEntityEventArgs e) 
    { 

    }; 
_serviceContext.ReadingEntity += aDelegate; 
_serviceContext.ReadingEntity -= aDelegate; 

Si vous ne le faites pas de cette façon, il n'y a aucun moyen de vous désabonner. La portée n'est pas limitée à la méthode dans laquelle elle a été enregistrée. Il sera enregistré pour la durée de vie de l'événement.

+0

Merci Zaid. Le code que vous avez collé était proche mais n'a pas été compilé - j'ai dû utiliser un EventHandler plutôt qu'une Action. –

+1

@AndrewBSchultz édité en conséquence .. –

Questions connexes