2008-10-09 18 views
28

क्या वीक रेफरेंस के माध्यम से ईवेंट हैंडलिंग को लागू करने के लिए यह एक अच्छा अभ्यास है यदि वह घटना संदर्भ रखने वाली एकमात्र चीज है और हमें ऑब्जेक्ट को कचरा इकट्ठा करने की आवश्यकता होगी?वीक रेफरेंस और इवेंट हैंडलिंग

यह करने के लिए एक तर्क के रूप में:

लोग कहते हैं कि यह सदस्यता समाप्त करना आपकी ज़िम्मेदारी है अगर आप कुछ करने के लिए सदस्यता और आप इसे क्या करना चाहिए।

+0

प्रश्न बन जाता है: ऑब्जेक्ट कचरा इकट्ठा होने तक उस घटना को निकाल दिया जाता है? पहली जगह में वीक रेफरेंस का उपयोग क्यों करें? –

+0

@ जोन लिमजप कमजोर होने के बिना, वह मौका शून्य नहीं है क्योंकि घटना वस्तु का ट्रैक रखती है और इसलिए इसे एकत्र नहीं किया जाएगा? – fostandy

+0

@ फोस्टंडी: नहीं, किसी घटना का प्रकाशक ग्राहकों द्वारा जीवित नहीं रखा जाएगा, यह केवल दूसरे तरीके से काम करता है। ग्राहकों को पहले सदस्यता समाप्त किए बिना जीसीएड होने की अनुमति देने के लिए, किसी को वीक रेफरेंस का उपयोग करना चाहिए। देखें: http://stackoverflow.com/a/298276/134761 – angularsen

उत्तर

-2

जबकि आप जो सुझाव देते हैं, वह समस्याओं का एक सेट हल करता है (घटना संदर्भ प्रबंधन और स्मृति रिसाव रोकथाम), यह समस्याओं का एक नया सेट खोलने की संभावना है।

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

+1

जब सीएलआर पहले से ही ईवेंट हैंडलर निष्पादित करता है, तो स्टैक "इस" के संदर्भ में रखेगा और ऑब्जेक्ट्स एकत्र नहीं किए जाएंगे। –

9

कमजोर प्रतिनिधि पैटर्न कुछ ऐसा है जो सीएलआर में होना चाहिए। सामान्य घटनाएं "जीवित रहते समय मुझे सूचित करें" अर्थशास्त्र, जबकि अक्सर हमें "जिंदा रहते हुए मुझे सूचित करें" की आवश्यकता होती है। वीक रेफरेंस पर प्रतिनिधि होने के नाते गलत है, क्योंकि प्रतिनिधि भी एक वस्तु है और यहां तक ​​कि जब रसीद अभी भी जीवित है और आने वाले संदर्भ हैं, प्रतिनिधि स्वयं को केवल वीक रेफरेंस द्वारा संदर्भित किया जा रहा है और तुरंत एकत्र किया जाएगा। कार्यान्वयन के उदाहरण के लिए this old post देखें।

6

कमजोर संदर्भ अपने अधिकार में, समस्या का समाधान न करें क्योंकि प्रतिनिधि का संदर्भ है। कंपोजिट एप्लिकेशन लाइब्रेरी में प्रिज्म (www.microsoft.com/compositewpf) के साथ जहाजों में एक वीकडिलेगेट क्लास है जिसे आप स्रोत से खींच सकते हैं। WeakDelegate मूल रूप से प्रतिबिंब ues और एक पल के लिए केवल एक पल के लिए एक प्रतिनिधि बनाता है और फिर इसे जारी करता है, इस प्रकार कोई पॉइंटर्स कोई पकड़ नहीं है। सीएएल के भीतर इवेंटएग्रेगेटर कक्षा द्वारा इसका उपयोग किया जाता है, लेकिन आप अपने स्वयं के उपयोग के लिए इसे बाहर निकालने के लिए स्वतंत्र हैं क्योंकि यह एमएस-पीएल के तहत है।

13

जब आप कर सकते हैं घटनाओं से सदस्यता रद्द करने की आदत में जाना अच्छा होता है, लेकिन कभी-कभी कोई स्पष्ट "सफाई" विधि नहीं होती है जहां यह किया जा सकता है। हमने हाल ही में इस विषय पर blog article पोस्ट किया है; इसमें वे विधियां शामिल हैं जो वीक रेफरेंस के साथ किसी ईवेंट की सदस्यता लेना आसान बनाती हैं।