7

सुनिश्चित करने के लिए संवाद फ़ॉर्म के चारों ओर कथन का उपयोग करना हमारे पास एक विंडोज़ फॉर्म एप्लिकेशन है जिसमें हजारों रूप हैं।कचरा संग्रह

इनमें से कई अस्थायी रूप से ShowDialog() विधि के माध्यम से संवाद के रूप में प्रदर्शित होते हैं।

यह एप्लिकेशन वर्षों से आसपास रहा है और हमने पाया है कि फॉर्म में विभिन्न संसाधन रिसाव या उपयोग में आने वाले नियंत्रणों के कारण कई रूपों को समय-समय पर कचरा नहीं मिल रहा है।

विशेष रूप से, हमें जीडीआई + संसाधनों के उदाहरण मिल गए हैं जिन्हें उचित तरीके से निपटान नहीं किया जा रहा है, हालांकि अन्य प्रकार के संसाधन रिसाव भी हो सकते हैं जिन्हें अभी तक विशेषता नहीं मिली है।

हालांकि इसे हल करने का सही तरीका स्पष्ट रूप से हर रूप और हर नियंत्रण के माध्यम से जाना है और सभी संसाधन समस्याओं को खत्म करना है। इसे पूरा करने में कुछ समय लगेगा।

एक अल्पकालिक विकल्प के रूप में, हमने पाया है कि फॉर्म पर निपटान() को स्पष्ट रूप से कॉल करना कचरा संग्रह प्रक्रिया शुरू करने लगता है और फॉर्म और उसके संसाधन तुरंत हटा दिए जाते हैं।

मेरा सवाल यह है कि क्या प्रत्येक फॉर्म के शोडियलॉग() ब्लॉक को एक उपयोग कथन में लपेटने के लिए एक उचित कामकाज होगा ताकि फ़ॉर्म को प्रदर्शित करने के बाद निपटान() को कॉल किया जा सके, और यह संस्थान के लिए भी एक अच्छा अभ्यास होगा सामान्य रूप में?

public void ShowMyForm() 
{ 
    MyForm myForm = new MyForm(); 
    myForm.ShowDialog(); 
} 
इस के लिए

:

उदाहरण के लिए, इस से मौजूदा कोड बदलने

public void ShowMyForm() 
{ 
    using (MyForm myForm = new MyForm()) 
    { 
     myForm.ShowDialog(); 
    } 
} 

अपने परीक्षण में MyForm के निपटान() विधि पहला उदाहरण के लिए बुलाया जाता है कभी नहीं है, लेकिन यह दूसरे उदाहरण के लिए तत्काल बुलाया जाता है।

क्या यह एक अल्पकालिक कार्यवाही के रूप में उचित दृष्टिकोण की तरह प्रतीत होता है, जबकि हम प्रत्येक विशिष्ट संसाधन समस्याओं को ट्रैक करने में समय व्यतीत करते हैं?

क्या ऐसे अन्य दृष्टिकोण हैं जिन पर हम इन प्रकार के संसाधन मुद्दों की पहचान और समाधान के लिए अल्पकालिक कार्यवाही और/या पद्धतियों के लिए विचार कर सकते हैं?

+0

हां, यह उपयोग-और-त्याग संवाद के लिए सबसे अच्छा अभ्यास है। साथ ही, निपटान केवल तभी बुलाया जाएगा यदि आप इसे स्पष्ट रूप से कॉल करते हैं (जैसे कि 'उपयोग' के माध्यम से), इसलिए यदि आपके पास अप्रबंधित संसाधन हैं, तो आपको यह सुनिश्चित करने के लिए कि फाइनेंशियल हैं या विभिन्न सेफहैंडल डेरिवेटिव्स जैसे रैपर वर्गों का उपयोग करने की आवश्यकता हो सकती है अगर निपटान नहीं किया जाता है तो भी साफ हो जाता है। –

+1

ध्यान दें कि निपटान() और जीसी के बीच एक बड़ा अंतर है। निपटान करना सही काम है, और अप्रबंधित संसाधनों को मुक्त कर देगा, लेकिन जीसी नहीं है। –

+0

साइड नोट: 'Controls.Clear(); 'का उपयोग करके स्मृति मेमोरी का कारण बन सकता है। यहां हंस की टिप्पणी देखें http://stackoverflow.com/a/7706549/939213। – ispiro

उत्तर

11

MSDN के अनुसार, आप स्पष्ट रूप से निपटान ShowDialog का उपयोग कर दिखाया रूपों पर कॉल करना होगा (विधि शो के साथ के विपरीत):

एक रूप एक मॉडल संवाद बॉक्स के रूप में प्रदर्शित होता है, (बंद बटन पर क्लिक फॉर्म के ऊपरी-दाएं कोने में एक्स के साथ बटन) फॉर्म को छिपाने का कारण बनता है और DialogResult प्रॉपर्टी को को DialogResult.Cancel पर सेट किया जा सकता है। गैर-मोडल रूपों के विपरीत, बंद विधि .NET Framework द्वारा नहीं बुलाई जाती है जब उपयोगकर्ता एक संवाद बॉक्स के बटन पर क्लिक करता है या DialRResult प्रॉपर्टी का मान सेट करता है। इसके बजाय फ़ॉर्म छिपा हुआ है और संवाद बॉक्स के नए उदाहरण के बिना फिर से दिखाया जा सकता है। चूंकि एक प्रपत्र के रूप में प्रदर्शित एक फॉर्म बॉक्स बंद होने के बजाय छिपा हुआ है, तो आपको फॉर्म के की डिस्प्ले विधि को कॉल करना होगा जब फॉर्म को आपके एप्लिकेशन द्वारा अब आवश्यकता नहीं है।

+0

यह सीखना बहुत दिलचस्प था, खासकर जब से यह फॉर्म के लिए सहायता पाठ में सही दिखाई देता है .ShowDialog विधि: http://msdn.microsoft.com/en-us/library/c7ykbedk.aspx – Avalanchis

+0

यदि निपटान के बाद नहीं कहा जाता है ShowDialog, लेकिन फॉर्म में कोई संसाधन रिसाव नहीं है, क्या अंततः इसे किसी भी तरह से निपटाना होगा (ऐप को समाप्त करने से पहले)? – Avalanchis

1

सामान्यतः यह ID12pos4 लागू करने वाले ऑब्जेक्ट्स के लिए using कथन का उपयोग करने का एक अच्छा तरीका है।

एक छोटी सी नमूना स्थिति:

कहते हैं कि तुम एक तीसरी पार्टी "घटक" है देता है। आप नहीं जानते कि आंतरिक रूप से पर क्या होता है और शायद यह ऑब्जेक्ट्स एक temp फ़ाइल बनाता है और Dispose पर फ़ाइल को हटा देता है। यदि आप Dispose() पर कॉल न करें और using का उपयोग न करें तो फ़ाइल कभी भी हटा नहीं जाएगी।

अपने मामले में आप इसे तब भी कर सकते हैं जब तक आप अपना फॉर्म modal खोलें।

2

मोडल संवाद के लिए, आप पैटर्न का उपयोग करना चाहिए:

using (var dlg = new MyDialog()) 
{ 
    // other code here to initialize, etc. 
    dlg.ShowDialog(); 
} 

के बाद से MyDialogफार्म से ली गई है, और फार्म IDisposable, इस पैटर्न को सही ढंग से सफाई होगा अपने संवाद लागू करता है।

यह "अल्पकालिक कार्यवाही" नहीं होना चाहिए, लेकिन मानक तरीके से आपको अपने सभी मोडल संवादों का आह्वान करना चाहिए।

मोडलेस संवाद एक और कहानी है। आपको स्वयं का ट्रैक रखने की आवश्यकता होगी, और पर कॉल करें अपने आवेदन के उचित बिंदुओं पर निपटें।