2009-08-28 16 views
20

Me encontré con esta pregunta en una prueba de práctica de Microsoft y me confundí. Aquí está la pregunta:Levante un evento en C#

¿Cuál de las muestras de código siguiente de C# es la forma correcta de generar un evento, suponiendo que el evento de alarma, la clase AlarmEventArgs, y el delegado AlarmEventHandler han sido declarada?

Aquí está la respuesta "correcta" que proporcionaron:

AlarmEventArgs e = new AlarmEventArgs(1, 2); 
AlarmEventHandler handler = Alarm; 
if (handler != null) 
{ 
    handler(this, e); 
} 

Sin embargo, también hay otra respuesta que parece correcta.

AlarmEventArgs e = new AlarmEventArgs(1, 2); 
if (Alarm!= null) 
{ 
    Alarm (this, e); 
} 

Personalmente, utilizo siempre el segundo método. Funciona bien. ¿Puede alguien decirme por qué debería usar el primer método en lugar de segundo?

+2

posible duplicado de [Comprobación de nulo antes de despachar el evento ... ¿es seguro para las subprocesos?] (Http://stackoverflow.com/questions/282653/checking-for-null-before-event-dispatching-thread-safe) – doppelgreener

Respuesta

15

Hice una pregunta similar. La respuesta aceptada es una buena explicación.

Checking for null before event dispatching... thread safe?

+0

El método de delegado anónimo propuesto por el usuario 'Cherian' es simplemente hermoso. El ganador es el ganador :) –

+0

Una vez que conoces el concepto algo funcional de que los manejadores vacíos están bien – spender

7

En un entorno multi-hilo, es posible que el controlador de eventos puede actualizarse mientras el evento está siendo enviado. Para evitar este escenario, asigne el controlador a una variable local antes de verificar el nulo y enviar el mensaje.

Cuestiones relacionadas