2011-02-26 14 views
5

क्या यह एक लम्बाडा को इवेंट हैंडलर के रूप में उपयोग करने का एक वैध तरीका है? ऐसा लगता है कि हैंडलर को सही ढंग से हटा दिया गया है और कचरा कलेक्टर इसे साफ करना चाहिए। हालांकि, मैंने किसी और को ऐसा नहीं देखा है, इसलिए मैंने सोचा कि मैं बेहतर दोबारा जांच करूँगा।क्या यह कचरा एकत्रित होगा?

ही पंक्तियों के साथ, क्या सबसे अच्छा उपकरण (अधिमानतः मुफ्त) है परीक्षण करने के लिए कि क्या यह वास्तव में कचरा जा रहा एकत्र उपयोग करने के लिए?

DispatcherTimer timer = new DispatcherTimer(); 
timer.Interval = TimeSpan.FromSeconds(10); 

EventHandler callback = null; 
callback = (s, e) => 
    { 
     timer.Stop(); 
     timer.Tick -= callback; 
    }; 

timer.Tick += callback; 
timer.Start(); 
+0

किसी भी दिलचस्पी के लिए, मैंने एक परीक्षण बनाया है जो ऊपर दिए गए कोड को 1 एम बार चलाता है। मेमोरी का उपयोग पूरे समय भी रहा। – herbrandson

उत्तर

3

हाँ, कॉलबैक के बाद कॉलबैक एक बार निष्पादित है कचरा संग्रहण के लिए पात्र होंगे। केवल एक बार हैंडलर निष्पादित करने के लिए किसी ईवेंट की सदस्यता लेने का यह एक उचित तरीका है।

यह साबित कि प्रतिनिधि कचरा एकत्र किया जाएगा के लिए कठिन है - या वास्तव में उस वस्तु पर कब्जा कर लिया चर पकड़ इस्तेमाल callback और timer कचरा एकत्र किया जाएगा, बेशक ... तुम सच में एक finalizer डाल करना चाहते हैं वहां (जो निश्चित रूप से कचरा संग्रह को प्रभावित करता है), लेकिन आप जेनरेट कोड के रूप में नहीं कर सकते हैं।

4

एक DispatcherTimer डिस्पैचर वर्ग द्वारा जीवित रखा जाता है, यह एक List<DispatcherTimer> आंतरिक रूप से है कि किसी भी घड़ी है कि सक्षम है के लिए एक संदर्भ संग्रहीत करता रहता है। जैसे ही आप टाइमर को रोकते हैं, ऑब्जेक्ट उस सूची से हटा दिया जाता है, जिससे आप कचरा संग्रह के लिए योग्य बनाते हैं यदि आप इसके लिए कोई अतिरिक्त संदर्भ संग्रहीत नहीं करते हैं। जो आप इस मामले में नहीं करते हैं, टाइमर संदर्भ एक स्थानीय चर है।

आप स्वत: जनरेट वर्ग कि लैम्ब्डा लागू करता है पर एक finalizer नहीं मिल सकता है। अगली सबसे अच्छी बात यह है कि इस कोड को केवल एक अरब बार चलाने के लिए। यदि आपको भाग्यशाली सदस्य खपत और ओओएम नहीं मिलता है तो यह स्पष्ट रूप से रिसाव नहीं करता है। आप अंतराल को छोटा बनाना चाहते हैं, इसलिए यह क्रिसमस तक नहीं लेता है, 15 एमसीसी अच्छा है। विधि को कॉल करने के लिए टाइमर का उपयोग करें ताकि आपको एक ही समय में बहुत से सक्रिय टाइमर न मिलें और प्रेषक को अपना काम करने दें।

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