2009-08-28 22 views
20

Natknąłem się na to pytanie w teście Microsoft Practice i byłem zdezorientowany. Oto pytanie:Podnieś wydarzenie w języku C#

Które z kodu po C# próbek jest właściwy sposób podnieść zdarzenie, zakładając, że zdarzenie alarmowe, klasa AlarmEventArgs i AlarmEventHandler delegat zostały oświadczył?

Oto „poprawna” odpowiedź zapewnili:

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

Jednak istnieje także inna odpowiedź, która wydaje się prawidłowe.

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

Ja osobiście zawsze używam drugiej metody. Działa dobrze. Czy ktoś może mi powiedzieć, dlaczego powinienem użyć pierwszej metody zamiast drugiej?

+2

możliwy duplikat [Sprawdzanie wartości zerowej przed wysłaniem zdarzenia ... wątek bezpieczny?] (Http://stackoverflow.com/questions/282653/checking- for-null-before-event-dispatching-thread-safe) – doppelgreener

Odpowiedz

7

W środowisku wielowątkowym, to możliwe, że funkcja obsługi zdarzenia mogą być aktualizowane w czasie, gdy zdarzenie jest wywoływane. Aby uniknąć tego scenariusza, należy przypisać procedurę obsługi do zmiennej lokalnej przed sprawdzeniem wartości NULL i wysłaniem komunikatu.