2011-11-03 6 views
5

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

public class Entity 
{ 
    public event EventHandler NotifyEvent; 
} 

// And then, elsewhere, for a listen-once handler, we might do this: 
Entity entity = new Entity(); 
Action<object, EventArgs> listener = null; 
listener = (sender, args) => 
{ 
    // do something interesting 
    // unsubscribe, so we only get 1 event notification 
    entity.NotifyEvent -= new EventHandler(listener); 
}; 
entity.NotifyEvent += new EventHandler(listener); 

नोट आप 'श्रोता' घोषित करने और एक मूल्य (शून्य) आवंटित करने के लिए है। अन्यथा संकलक 'असाइन किए गए स्थानीय चर का उपयोग listener'

+0

ब्रेसिज़ में 'एक्शन <ऑब्जेक्ट, इवेंटआर्ग> श्रोता = नल;' से शुरू होने वाले कोड के हिस्से को संलग्न करके आप अपना कोड अधिक अभिव्यक्ति कर सकते हैं। लेकिन मुझे यकीन नहीं है कि क्या यह कचरा कलेक्टर के लिए जीवन को आसान बना देगा: आखिरकार, आप वैसे भी अपने चर का उपयोग नहीं करते हैं! – Vlad

उत्तर

6

इस पैटर्न के साथ कुछ भी गलत नहीं है। यह एक ही पैटर्न है I और कई अन्य एक ईवेंट हैंडलर को लैम्ब्डा अभिव्यक्ति को असाइन करने और हटाने के लिए उपयोग करते हैं।

+0

इस कोड के बारे में एक प्रश्न: क्या प्रेषक को सदस्यता समाप्त करने के लिए उपयोग किया जा सकता है? कुछ (प्रेषक के रूप में प्रेषक) की तरह कुछ। .NotifyEvent - = नया EventHandler (श्रोता) भी लैम्बा अभिव्यक्ति के अंदर, या यह कुछ पक्ष के मुद्दे हो सकता है? –

+0

@RickyAH संभवतः। यह कुछ प्रकार के लिए काम करेगा हालांकि मैं इसे करने की सिफारिश नहीं करता। मैं आम तौर पर घटना पैटर्न के 'प्रेषक' हिस्से पर भरोसा करने से बहुत सावधान हूं। यह कई बार उपयोगी होता है लेकिन आम तौर पर मुझे लगता है कि यह प्रतिक्रिया के लिए एक अविश्वसनीय मूल्य – JaredPar

+0

धन्यवाद है। –

4

जबकि मुझे लगता है कि सामान्य पैटर्न ठीक है, तो मैं Action<object, EventArgs> से नहीं जाऊंगा। मैं उपयोग करूंगा:

EventHandler listener = null; 
listener = (sender, args) => 
{ 
    // do something interesting 
    // unsubscribe, so we only get 1 event notification 
    entity.NotifyEvent -= listener; 
}; 
entity.NotifyEvent += listener; 
+0

टिप के लिए धन्यवाद। मैं वास्तव में वैसे भी कस्टम इवेंट प्रतिनिधि का उपयोग करता हूं, लेकिन उदाहरण के लिए मैंने इवेंट हैंडलर को इवेंट प्रतिनिधि के रूप में इस्तेमाल किया, क्योंकि अधिक लोग इसे पहचानते हैं। कार्रवाई <ऑब्जेक्ट, EventArgs> पर पूरी तरह से दूरी पर, हालांकि, धन्यवाद। (हालांकि, आपका उत्तर संदर्भ देने के लिए मेरे कम से कम आदर्श उदाहरण को छोड़ देगा) – Matt

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

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