2010-05-07 23 views
5

मैं सी # के लिए कस्टम ईवेंट कर रहा हूं और कभी-कभी यह काम नहीं कर रहा है।कस्टम घटनाओं के बारे में प्रश्न

यह कैसे मैं घटना बना रही हूँ है:

private bool isDoorOpen; 
    public bool IsDoorOpen { 
     get { return isDoorOpen;} 
     private set { isDoorOpen = value; DoorsChangeState(this, null);} 
    } 

और ये घटना घोषणाओं हैं:

//events   
    public delegate void ChangedEventHandler(Elevator sender, EventArgs e); 
    public event ChangedEventHandler PositionChanged; 
    public event ChangedEventHandler DirectionChanged; 
    public event ChangedEventHandler BreaksChangeState; 
    public event ChangedEventHandler DoorsChangeState; 

यह लंबे समय के रूप में काम करता है के रूप में वहाँ की घटनाओं से जुड़ी तरीके हैं, लेकिन यदि नहीं है, तो यह एक शून्य अपवाद अपवाद फेंकता है। मैं क्या गलत कर रहा हूं?

उत्तर

10

एक घटना कॉल करने के लिए सुझाया गया तरीका

var handler = this.DoorsChangeState; 
if (handler != null) 
    handler(this, null); 

है स्थानीय स्तर पर हैंडलर कॉपी करने के लिए कारण एक और धागा पर बैठाना ईवेंट हैंडलर परिवर्तन करते समय आप अशक्त के लिए जाँच कर रहे हैं है।

संपादित करें: दौड़ की स्थिति के बारे में बात करते हुए आलेख मिला। http://blogs.msdn.com/ericlippert/archive/2009/04/29/events-and-races.aspx

+0

+1 पता ही नहीं था थ्रेड सुरक्षा समस्याएं और तथ्य यह है कि घटनाएं अपरिवर्तनीय हैं। लिंक के लिए धन्यवाद। –

0

यदि किसी ईवेंट को आग लगने पर सब्सक्राइब नहीं किया जाता है, तो NullReferenceException फेंक दिया जाएगा। यह सही व्यवहार है, ऐसा कुछ नहीं जिसे आपने गलत किया है।

आप की जाँच करनी चाहिए:

if(DoorsChangeState != null) 
{ 
    DoorsChangeState(this, null); // Only fire if subscribed to 
} 
0

एक घटना अगर घटना रिक्त है आप की जांच करना चाहिए लागू करने से पहले:

if (DoorsChangeState != null) 
    DoorsChangeState(this, null); 

जब DoorsChangeState रिक्त है इसका मतलब है कि घटना पर कोई श्रोताओं देखते हैं।

0

आपको यह देखने के लिए जांच करनी होगी कि ईवेंट की सदस्यता ली गई है या नहीं।

मैं अपने सभी कार्यक्रमों को फेंकने के लिए इस मानक रूप का उपयोग करता हूं।

var temp = EventName; 
if(EventName!= null) 
    temp(this, null); 
4

मुझे पता है कि इस प्रश्न पर कई बार चर्चा की गई है (और उत्तर दिया गया है)।

public static class EventHandlerExtensions 
{ 
    public static void FireEvent<T>(this EventHandler<T> handler, object sender, T args) where T : EventArgs 
    { 
     var temp = handler; 
     if (temp != null) 
     { 
      temp(sender, args); 
     } 
    } 

    public static void FireEvent(this EventHandler handler, object sender) 
    { 
     var temp = handler; 
     if (temp != null) 
     { 
      temp(sender, EventArgs.Empty); 
     } 
    } 
} 

तो अपने कोड में आप कह सकते हैं:

भी यहीं कहीं मैं इस पद्धति अधिक आसान उपयोग करने के लिए बनाने के लिए निम्न एक्सटेंशन तरीकों मिला

public bool IsDoorOpen 
{ 
    get { return isDoorOpen;} 
    private set 
    { 
     isDoorOpen = value; 
     DoorsChangeState.FireEvent(this); 
    } 
} 
+0

+1 यह एक बहुत अच्छा वाक्यविन्यास बनाता है! – MPritchard

संबंधित मुद्दे