2010-05-08 4 views
8

के साथ मेमोरी लीक मैं बहुत सारे कस्टम नियंत्रण बना रहा हूं और उन्हें फ़्लोलाउटआउट पैनल में जोड़ रहा हूं। डिज़ाइन समय पर बनाए गए और पॉप्युलेट किए गए कॉन्टेक्स्टमेनूस्ट्रिप भी हैं।ContextMenuStrip

हर बार जब पैनल में नियंत्रण जोड़ा जाता है, तो इसकी मेन्यूस्ट्रिप संपत्ति इस मेनू में असाइन की जाती है, ताकि सभी एक ही मेनू को "साझा" कर सकें। लेकिन मैंने देखा कि जब पैनल से नियंत्रण हटा दिए जाते हैं और इसका निपटारा किया जाता है, तो टास्क मैनेजर में उपयोग की जाने वाली स्मृति ड्रॉप नहीं होती है। जब भी नियंत्रण बनाया जाता है और लेआउट पैनल में जोड़ा जाता है तो यह लगभग 50kB तक बढ़ता है।

मैंने .NET मेमोरी प्रोफाइलर का परीक्षण डाउनलोड किया और यह दिखाया गया कि नियंत्रण के निपटारे के बाद चारों ओर लटकने वाली मेन्यू स्ट्रिप के संदर्भ थे। मैंने नियंत्रण को निपटाने से पहले ContextMenuStrip प्रॉपर्टी को स्पष्ट रूप से सेट करने के लिए कोड को बदल दिया है, और हाँ, अब स्मृति जारी की गई है। ऐसा क्यों है? जीसी इस तरह की चीज को साफ नहीं करना चाहिए?

+0

http://connect.microsoft.com/VisualStudio/feedback/details/116059/contextmenustrip-memory-leak – CharithJ

उत्तर

5

यदि आप नियंत्रण की ContexmenuStrip प्रॉपर्टी पर एक नज़र डालें, तो आप देखेंगे कि सेटर मेनूस्ट्रिप की डिसपोज़ड इवेंट पर नियंत्रण की सदस्यता लेता है, जिससे मेनूस्ट्रिप से नियंत्रण में बैक-रेफरेंस बना दिया जाता है।

इसका मतलब है कि यह पहुंचने योग्य घटना के क्लासिक केस है और आपको पहले से ही समाधान मिला है: ContexmenuStrip प्रॉपर्टी को शून्य पर सेट करें।

+0

धन्यवाद हेनक। मैं सी # के लिए नया हूं लेकिन आप जो मतलब चाहते हैं उसका सारांश प्राप्त करें। लेकिन इतनी मेमोरी क्यों उठाई जा रही है? इस रिसाव को खोजने के बाद मुझे एहसास हुआ कि उदाहरणों को नष्ट करने से पहले मैं अपने स्वयं के वर्गों में कुछ कस्टम घटनाओं से सदस्यता नहीं ले रहा था। और फिर भी ऐसा लगता है कि किसी भी स्मृति की खपत में वृद्धि नहीं हुई है। या वह एक अलग जानवर है? – Dave

+1

ध्यान दें कि यह असमान है, अगर आपने कॉन्टेक्स्टमेनू को खारिज कर दिया था तो कोई समस्या नहीं होगी। मैं ContextMenuStrip की एक संभावित डिजाइन गलती पर विचार करता हूं, यह इस तरह के बैक-लिंक के लिए स्नीकी है। अपने स्वयं के वर्गों में इससे सावधान रहें। लेकिन जब वर्ग की सदस्यता लेना रद्द किया जाता है तो कोई समस्या नहीं होती है। –

+0

ओह ठीक है। धन्यवाद। मुझे लगता है कि यह .NET ढांचे में एक दुर्लभ समस्या है? मेमोरी प्रोफाइलर के उपयोग के बिना शायद मैं इस छोटे शैतान पर नहीं उठा होता। – Dave

0

यदि आप हर बार गतिशील बनाते हैं तो आपको हमेशा ContextMenuStrip का निपटान करना चाहिए। ऐसा इसलिए है क्योंकि हर बार एक देशी हैंडल बनाया जाता है, लेकिन नष्ट नहीं होता है। इसका मतलब है कि यदि आप contextmenu बनाते हैं और इसे दिखाते हैं, तो इसे बंद करें और इसे फिर से दिखाएं कि आप हैंडल से बाहर हो जाएंगे।