2009-07-15 13 views
5

मैं कोड की इस तरह कुछ स्थानों को देखा है के साथ एक ईवेंट हैंडलर शुरु कर रहा है:सी #: एक डमी

public event SomeEventHandler SomeEvent = (s, e) => { }; 

है कि काम करने के एक सुझाया गया तरीका? यह क्या हल करता है, और क्या इसका कोई उल्लेखनीय दुष्प्रभाव है? क्या मुझे अभी भी शून्य जांच करनी होगी? या यह वही है जो मुझे और करने की ज़रूरत नहीं है? क्या कचरा संग्रह अभी भी काम करेगा जैसा इसे करना चाहिए?


उदाहरण के लिए:

private PropertyChangedEventHandler propertyChanged; 
private readonly object propertyChangedLock = new object(); 
public event PropertyChangedEventHandler PropertyChanged 
{ 
    add 
    { 
     lock (propertyChangedLock) 
      propertyChanged += value; 
    } 
    remove 
    { 
     lock (propertyChanged) 
      propertyChanged -= value; 
    } 
} 
protected void OnPropertyChanged(string propertyName) 
{ 
    PropertyChangedEventHandler handler; 
    lock (propertyChangedLock) 
     handler = propertyChanged; 

    if (handler != null) 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
} 

मैं इस में पहली पंक्ति बदल सका:

private PropertyChangedEventHandler propertyChanged = (s, e) => { }; 

और फिर OnPropertyChanged विधि में अशक्त की जांच को छोड़? और अगर मैं नल-चेक छोड़ देता हूं तो क्या मैं लॉक भी छोड़ सकता हूं? यदि ऐसा है तो मुझे यह दे देगा:

protected void OnPropertyChanged(string propertyName) 
{ 
    propertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 

क्या प्रारंभ में प्रारंभिक समय लेना सुरक्षित होगा? या क्या कुछ साइड इफेक्ट्स हैं जिन्हें मैंने याद किया है?

+2

विषय पर मेरे लेख: http://blogs.msdn.com/ericlippert/archive/2009/04/29/events-and-races.aspx –

+0

अच्छा लेख! दूसरे शब्दों में, इस मामले में शून्य जांच को हटा देना थ्रेड-सुरक्षित होगा। लेकिन ग्राहकों को स्मार्ट हैंडलर की आवश्यकता होती है जो टूट नहीं जाती हैं। क्या मैने इसे सही समझा? – Svish

उत्तर

7

आप तुच्छता चेकों ऐसा करने के लिए, यदि आप वास्तव में बनाने की कोशिश करना चाहते हैं की जरूरत नहीं है जबकि घटना धागा सुरक्षित, आप अभी भी एक ताला में यह लाने की जरूरत है:

protected void OnPropertyChanged(string propertyName) 
{ 
    PropertyChangedEventHandler handler; 
    lock (propertyChangedLock) 
    { 
     handler = propertyChanged; 
    } 
    handler(this, new PropertyChangedEventArgs(propertyName)); 
} 

नहीं तो आप सबसे हाल ही में मूल्य प्राप्त करने में कठिनाई नहीं किया जा सकता - ईवेंट हैंडलर्स एक अलग सूत्र में जोड़े जा रहे हैं, तो आप सैद्धांतिक रूप से घटनाओं बढ़ा सकता है हमेशा नए हैंडलर को बुलाए बिना हमेशा के लिए। अभ्यास में मेरा मानना ​​है कि आप लगभग हमेशा लॉक के बिना दूर हो जाएंगे, लेकिन स्मृति-मॉडल शब्दों में आपके पास कुछ बाड़ की तरह होना चाहिए।

व्यक्तिगत रूप से मैं अनुशंसा करता हूं कि को ईवेंट थ्रेड-सुरक्षित बनाने के लिए प्रयास करें।

+0

तो क्या आप बस सभी थ्रेड-सुरक्षित सामान को छोड़ देंगे? – Svish

+0

हां। उचित धागे में सदस्यता लेने के लिए कॉलर्स प्राप्त करें। –

+0

आप यह कैसे करेंगे? – Svish

0

आप NULL Object pattern के एक कार्यान्वयन के रूप में यह देख सकते हैं।

इसके बाद से आप शून्य करने की ज़रूरत नहीं है, अपने कोड अधिक पठनीय बनाने में मदद करता है - मूल्य जाँच करता है। अगर वे अब आवश्यक हो

अपने ऐड में ताले/तर्क निकालने के लिए, रहने के लिए होगा। उनके पास इसके साथ कुछ लेना देना नहीं है। वे जाति-स्थिति से बचने के लिए इस्तेमाल कर रहे हैं (लेकिन यदि वे आपके बहुत स्थिति में आवश्यक हो मुझे पता नहीं)

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