2010-08-30 7 views
5

À un moment donné dans mon code, je me abonner à the following event: -Comment puis-je vérifier si un événement a été souscrit, dans .NET?

UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 

fonctionne très bien et quand l'événement se déclenche Recieved Message Queue terminée, gère mon DELEGUEZ.

Maintenant, je veux vérifier pour voir si l'événement a été souscrit, avant de m'abonner. Je reçois une erreur de compilation quand je fais: -

// Compile Time Errors... 
if (UploadFolderMessageQueue.ReceiveCompleted == null) 
    { 
     UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 
     UploadFolderMessageQueue.Formatter = 
      new XmlMessageFormatter(new[] {typeof (string)}); 
    } 

L'événement « System.Messaging.MessageQueue.ReceiveCompleted » ne peut apparaître sur le côté gauche de + = ou - =

Je sais que c'est honteusement simple, .. mais je suis déconcerté :(toute suggestion?

+0

Vous devriez essayer de concevoir votre code de sorte que vous vous abonnez et vous désabonnez de manière prévisible. –

Répondre

13

vous ne pouvez pas faire de l'abonné à l'événement. peut vérifier l'éditeur que s'il y a des abonnés. Yo u besoin de garder une trace de l'abonnement en utilisant un autre mécanisme dans votre classe comme:

UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 
bool handlerAttached=true; 

vous pouvez utiliser ceci:

if(handlerAttached) 
{ 
    //DO YOUR STUFF 
} 
0

Le test nul ne peut être effectué dans la classe qui déclare la événement (ie le type UploadFolderMessageQueue.)

1) Si vous avez accès à la source de cette classe, vous pouvez ajouter une méthode ou une propriété qui effectue le test et renvoie un résultat booléen que vous pouvez vérifier avant de vous abonner. 2) Si vous ne pouvez pas modifier la classe déclarante, et que vous vérifiez uniquement les réabonnements à partir de votre propre code, vous pouvez enregistrer séparément l'abonnement dans une variable booléenne, puis vérifier cette variable avant de tenter de (re) souscrire.

3) Si vous ne pouvez pas modifier la classe déclarante et que vous recherchez des abonnements à partir d'un code autre que le vôtre, il ne semble pas y avoir de solution.

14

Si vous devez vous assurer qu'il n'y a qu'un seul abonné vous pouvez utiliser le code suivant:

UploadFolderMessageQueue.ReceiveCompleted -= UploadMSMQReceiveCompleted; 
UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 

Si UploadFolderMessageQueue.ReceiveCompleted est null alors la première ligne ne fera rien, dans d'autres cas, le gestionnaire d'événements sera enlevé. Cela signifie que UploadFolderMessageQueue.ReceiveCompleted aura toujours un seul abonné (bien sûr, si le UploadMSMQReceiveCompleted est le seul gestionnaire d'événement pour cet événement).

Questions connexes