2010-08-30 14 views
5

A un certo punto nel mio codice, sottoscrivo the following event: -Come posso verificare se un evento è stato sottoscritto, in .NET?

UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 

funziona alla grande e quando di Message Queue Recieved Completato generato l'evento, mio ​​delegato gestisce.

Ora, desidero VERIFICARE per vedere se l'evento è stato sottoscritto, prima di sottoscriverlo. Ottengo un errore di compilazione quando lo faccio: -

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

L'evento 'System.Messaging.MessageQueue.ReceiveCompleted' possono essere visualizzati solo sul lato sinistro del + = o - =

so che questo è imbarazzante semplice .. ma io sono sconcertato :(qualche suggerimento?

+0

Dovresti provare a progettare il tuo codice in modo da iscriverti e annullare l'iscrizione in modo prevedibile. –

risposta

13

non si può fare questo dal sottoscrittore alla manifestazione. Solo editore può verificare se ci sono gli abbonati. Yo u sarà bisogno di tenere traccia di abbonamento utilizzando qualche altro meccanismo nella classe come:

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

allora si può usare questo:

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

La prova nulla può essere eseguita solo all'interno della classe che dichiara la evento (es il tipo UploadFolderMessageQueue.)

1) Se si ha accesso all'origine di questa classe, è possibile aggiungere un metodo o una proprietà che esegue il test e restituisce un risultato booleano che è possibile verificare prima di sottoscrivere.

2) Se non è possibile modificare la classe di dichiarazione e si stanno verificando solo le ri-sottoscrizioni dal proprio codice, è possibile registrare separatamente la sottoscrizione in una variabile booleana e quindi controllare tale variabile prima di tentare di (ri) sottoscrivi.

3) Se non è possibile modificare la classe di dichiarazione e si stanno verificando le sottoscrizioni da codice diverso dal proprio, non sembra che vi sia una soluzione.

14

Se è necessario assicurarsi che non v'è un solo abbonato è possibile utilizzare il seguente codice:

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

Se UploadFolderMessageQueue.ReceiveCompleted è null quindi la prima linea non fa nulla, in altri casi il gestore di eventi sarà rimosso. Ciò significa che UploadFolderMessageQueue.ReceiveCompleted avrà sempre un solo sottoscrittore (ovviamente se lo UploadMSMQReceiveCompleted è l'unico gestore di eventi per quell'evento).

Problemi correlati