सवाल क्या ईवेंट हैंडलर को अपंजीकृत नहीं करना बुरा है?


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


55
2018-06-30 04:28


मूल




जवाब:


यदि आपके पास है A एक घटना प्रकाशित, और B किसी ईवेंट (हैंडलर) की सदस्यता लेना, तो यह केवल एक समस्या है कि सदस्यता समाप्त न करें A से काफी लंबा रहने जा रहा है B। असल में, घटना सदस्यता का मतलब है कि A अभी भी देख सकते हैं B, इसलिए इसे कचरा इकट्ठा करने से रोका जाएगा, और अगर आप इसके बारे में भूल गए हैं तो भी इस पर घटनाओं को आग लगेंगे (और शायद Disposed() यह)।

उदाहरण के लिए, यदि यह एक समस्या है A एक स्थिर घटना है, और आपका ऐप थोड़ी देर के लिए चलता है B मर जाता है...

यह ध्यान रखना महत्वपूर्ण है, कोई निम्नलिखित से पूछ सकता है:

यदि बी ए से बहुत लंबा रहता है, तो बी को कचरा होने से बचाएगा?

और इसका जवाब "नहीं" है। घटना के माध्यम से बी का कोई संदर्भ नहीं है; एक सामान्य के रूप में एकत्र किया जाएगा


72
2018-06-30 04:31



यदि बी संसाधन संसाधन भारी है तो यह विशेष रूप से खराब है ... - Nader Shirazie
महान अंतर्दृष्टि मार्क। स्थिर घटनाओं के लिए हैंडलर वास्तव में कुख्यात हैं अगर ग्राहक का निपटारा करते समय देखभाल नहीं की जाती है। - TheVillageIdiot
मुझे पता है कि यह एक पुरानी पोस्ट है और मुझे नहीं पता कि यह कभी पढ़ा जाएगा, लेकिन यदि बी ए से बहुत लंबा रहता है, तो क्या बी को कचरा इकट्ठा करने से रोक दिया जाएगा? - Scott Chamberlain
@Scott। नहीं - B इसका कोई संदर्भ नहीं है A घटना के माध्यम से; A सामान्य के रूप में एकत्र किया जाएगा। - Marc Gravell♦


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

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


14
2018-02-22 18:24