सुनिश्चित करने के लिए संवाद फ़ॉर्म के चारों ओर कथन का उपयोग करना हमारे पास एक विंडोज़ फॉर्म एप्लिकेशन है जिसमें हजारों रूप हैं।कचरा संग्रह
इनमें से कई अस्थायी रूप से ShowDialog() विधि के माध्यम से संवाद के रूप में प्रदर्शित होते हैं।
यह एप्लिकेशन वर्षों से आसपास रहा है और हमने पाया है कि फॉर्म में विभिन्न संसाधन रिसाव या उपयोग में आने वाले नियंत्रणों के कारण कई रूपों को समय-समय पर कचरा नहीं मिल रहा है।
विशेष रूप से, हमें जीडीआई + संसाधनों के उदाहरण मिल गए हैं जिन्हें उचित तरीके से निपटान नहीं किया जा रहा है, हालांकि अन्य प्रकार के संसाधन रिसाव भी हो सकते हैं जिन्हें अभी तक विशेषता नहीं मिली है।
हालांकि इसे हल करने का सही तरीका स्पष्ट रूप से हर रूप और हर नियंत्रण के माध्यम से जाना है और सभी संसाधन समस्याओं को खत्म करना है। इसे पूरा करने में कुछ समय लगेगा।
एक अल्पकालिक विकल्प के रूप में, हमने पाया है कि फॉर्म पर निपटान() को स्पष्ट रूप से कॉल करना कचरा संग्रह प्रक्रिया शुरू करने लगता है और फॉर्म और उसके संसाधन तुरंत हटा दिए जाते हैं।
मेरा सवाल यह है कि क्या प्रत्येक फॉर्म के शोडियलॉग() ब्लॉक को एक उपयोग कथन में लपेटने के लिए एक उचित कामकाज होगा ताकि फ़ॉर्म को प्रदर्शित करने के बाद निपटान() को कॉल किया जा सके, और यह संस्थान के लिए भी एक अच्छा अभ्यास होगा सामान्य रूप में?
public void ShowMyForm()
{
MyForm myForm = new MyForm();
myForm.ShowDialog();
}
इस के लिए
:
उदाहरण के लिए, इस से मौजूदा कोड बदलने
public void ShowMyForm()
{
using (MyForm myForm = new MyForm())
{
myForm.ShowDialog();
}
}
अपने परीक्षण में MyForm के निपटान() विधि पहला उदाहरण के लिए बुलाया जाता है कभी नहीं है, लेकिन यह दूसरे उदाहरण के लिए तत्काल बुलाया जाता है।
क्या यह एक अल्पकालिक कार्यवाही के रूप में उचित दृष्टिकोण की तरह प्रतीत होता है, जबकि हम प्रत्येक विशिष्ट संसाधन समस्याओं को ट्रैक करने में समय व्यतीत करते हैं?
क्या ऐसे अन्य दृष्टिकोण हैं जिन पर हम इन प्रकार के संसाधन मुद्दों की पहचान और समाधान के लिए अल्पकालिक कार्यवाही और/या पद्धतियों के लिए विचार कर सकते हैं?
हां, यह उपयोग-और-त्याग संवाद के लिए सबसे अच्छा अभ्यास है। साथ ही, निपटान केवल तभी बुलाया जाएगा यदि आप इसे स्पष्ट रूप से कॉल करते हैं (जैसे कि 'उपयोग' के माध्यम से), इसलिए यदि आपके पास अप्रबंधित संसाधन हैं, तो आपको यह सुनिश्चित करने के लिए कि फाइनेंशियल हैं या विभिन्न सेफहैंडल डेरिवेटिव्स जैसे रैपर वर्गों का उपयोग करने की आवश्यकता हो सकती है अगर निपटान नहीं किया जाता है तो भी साफ हो जाता है। –
ध्यान दें कि निपटान() और जीसी के बीच एक बड़ा अंतर है। निपटान करना सही काम है, और अप्रबंधित संसाधनों को मुक्त कर देगा, लेकिन जीसी नहीं है। –
साइड नोट: 'Controls.Clear(); 'का उपयोग करके स्मृति मेमोरी का कारण बन सकता है। यहां हंस की टिप्पणी देखें http://stackoverflow.com/a/7706549/939213। – ispiro