2012-03-01 13 views
7

से कोई ईवेंट स्थापना मैं इस तरह एक कोड है:अशक्त

public class SomeClass 
{ 
    int _processProgress; 
    public int ProcessProgress 
    { 
     get { return _processProgress; } 
     set 
     { 
      _processProgress = value; 
      if (ProcessProgressChanged != null) 
       ProcessProgressChanged(value); 
     } 
    } 

    public delegate void ProcessProgressChangedEventHandler(int progressPercentage); 
    public event ProcessProgressChangedEventHandler ProcessProgressChanged; 

    public void ClearProcessProgressChangedEvent() 
    { 
     this.ProcessProgressChanged = null; 
    } 
} 

विल यह सदस्यता समाप्तProcessProgressChanged घटना जब मैं ClearProcessProgressChangedEvent() विधि कॉल में सभी विधि?

मेरा कोड सी #, फ्रेमवर्क 4 में है, वीएस -2010 प्रो में निर्माण, परियोजना Winforms में है।

कृपया मदद करें। अग्रिम में धन्यवाद।

+2

यह प्रश्न डुप्लिकेट नहीं है। उस प्रश्न में वे ऑब्जेक्ट को सेट करने के बारे में पूछ रहे हैं - जो घटना के साथ पंजीकृत है - शून्य तक। यह सवाल वे घटना को खुद को शून्य करने के बारे में पूछ रहे हैं। – Wes

उत्तर

14

अच्छा, यह प्रभावी रूप से ग्राहकों की सूची को स्पष्ट करेगा, हां (अंतर्निहित प्रतिनिधि क्षेत्र को null पर सेट करके) - ताकि अगली बार ProcessProgress सेट हो, कोई हैंडलर नहीं बुलाया जाएगा। यह वास्तव में ईवेंट से null पर सेट नहीं कर रहा है - यह अंतर्निहित फ़ील्ड को null पर सेट कर रहा है। यह सिर्फ इतना है कि सी # कंपाइलर एक घोषणा (एक सब्सक्राइब/सदस्यता रद्द करने की विधि) और एक घोषणा (हैंडलर स्टोर करने के लिए) दोनों एकल घोषणा का उपयोग कर बना रहा है।

आप मेरे article about events and delegates उपयोगी पा सकते हैं।

ध्यान दें कि वर्तमान में आपका ईवेंट-राइजिंग कोड थ्रेड-सुरक्षित नहीं है। मैं चाहे वह या नहीं की जरूरत है पता नहीं है, लेकिन करने के लिए उपयोग करने पर विचार आप चाहते हो सकता है:

set 
{ 
    _processProgress = value; 
    var handlers = ProcessProgressChanged; 
    if (handlers != null) 
    { 
     handlers(value); 
    } 
} 

इस तरह यदि पिछले हैंडलर से समाप्त कर दी है यदि आप एक NullReferenceException नहीं मिलेगा तुच्छता के बाद चेक करें से पहले आमंत्रण।

+1

धन्यवाद, और _thread-safe tip_ के लिए फिर से धन्यवाद। –

+0

जॉन, क्या आपको पता चलेगा कि अज्ञात प्रतिनिधियों को एक घटना में सब्सक्राइब करना है या फिर बाद में इसे शून्य से असाइन करके ईवेंट को साफ़ करना, उदाहरण के लिए, लैम्ब्डा अभिव्यक्ति में संदर्भित वस्तुओं पर कचरा संग्रहण को रोक सकता है? – Apelsin

+1

@ एपेलसिन: आपको ईमानदार होने के लिए एक और विशिष्ट उदाहरण देना होगा - संभवतः एक नए प्रश्न में। लेकिन अगर घटना का अंतर्निहित क्षेत्र शून्य हो गया है, तो मैं नहीं देख सकता कि कचरा संग्रह को रोकना क्या होगा। –

3

हां, यह ईवेंट से सभी को सदस्यता छोड़ देगा। वहाँ एक (बिट अप्रत्यक्ष IMHO) इस here के संदर्भ में है:

जब सभी ग्राहकों के एक घटना से सदस्यता त्याग दी है, प्रकाशक कक्षा में घटना उदाहरण null को तैयार है।

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