2010-08-30 15 views
5

En un momento en mi código, me suscribo a the following event: -¿Cómo puedo verificar si un evento se ha suscrito a, en .NET?

UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 

funciona muy bien y cuando la cola de mensajes Recieved Completado desencadena el evento, mi delegado maneja.

Ahora, deseo CHEQUEAR para ver si el evento se ha suscrito, antes de suscribirme. Me aparece un error en tiempo de compilación cuando lo haga: -

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

El evento 'System.Messaging.MessageQueue.ReceiveCompleted' puede aparecer sólo en el lado izquierdo de + = o - =

sé que esto es vergonzosamente sencilla .. pero estoy confundido :(¿alguna sugerencia?

+0

Debe intentar diseñar su código para que se suscriba y dé de baja de manera predecible. –

Respuesta

13

no se puede hacer esto desde el abonado al evento. Sólo editor puede comprobar si hay algún suscriptores. yo u necesitará hacer un seguimiento de suscripción a través de algún otro mecanismo en su clase como:

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

entonces usted puede utilizar esto:

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

La prueba nula sólo se puede realizar dentro de la clase que declara la evento (es decir, el tipo UploadFolderMessageQueue.)

1) Si tiene acceso al origen de esta clase, puede agregar un método o propiedad que haga la prueba y devuelva un resultado booleano que puede verificar antes de suscribirse.

2) Si no puede modificar la clase declarante, y solo está revisando las subscripciones de su propio código, puede registrar por separado la suscripción en una variable booleana y luego verificar esa variable antes de intentar (re) suscribir.

3) Si no puede cambiar la clase de declaración y está buscando suscripciones de código que no sea el suyo, no parece haber una solución.

14

Si usted necesita para asegurarse de que no hay más que un suscriptor puede utilizar el siguiente código:

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

Si UploadFolderMessageQueue.ReceiveCompleted es null entonces la primera línea no hará nada, en otro caso el controlador de eventos será remoto. Eso significa que UploadFolderMessageQueue.ReceiveCompleted siempre tendrá un solo suscriptor (por supuesto, si el UploadMSMQReceiveCompleted es el único controlador de eventos para ese evento).

Cuestiones relacionadas