2009-12-28 12 views
8

से अधिक थ्रेड (a, b, c आदि) तथ्य यह है कि साफ़() नेट घटक कंटेनरों में ing आइटम नहीं निपटान उन्हें (निपटान (सच) पर कॉल करके करता है के बारे में कर रहे हैं।साफ़ नियंत्रण उन्हें निपटान नहीं करता है - जोखिम क्या है?

सबसे अक्सर, IMHO, साफ-एड घटकों अब और आवेदन में इस्तेमाल नहीं कर रहे हैं, तो यह स्पष्ट रूप से उन्हें माता-पिता कंटेनरों से साफ़ करने के बाद निपटारा किया की जरूरत है।

हो सकता है कि एक अच्छा विचार है कि संग्रह के Clear विधि एक bool था पैरामीटर dispose कि जब सत्य में सूची से हटाने से पहले संग्रह तत्वों को भी निपटाया जाता है?

+0

, वे निपटाए मिल जाएगा। यदि ऐसा नहीं है, तो संभवतः (यदि प्रोग्रामर स्वीकृत प्रथाओं का पालन करता है) निपटाने के लिए अप्रबंधित कुछ भी नहीं है और केवल कचरा इकट्ठा करना सुरक्षित है। –

+0

@ अवीद: समस्या यह है कि निपटान विधि को जीसी द्वारा कभी नहीं बुलाया जाएगा, इसलिए संग्रह पर साफ़ करने से पहले आपको इसे स्वयं करने की ज़रूरत है। – serhio

+0

मेरा मतलब यह है कि, अगर नियंत्रक प्रोग्रामर ने अपने अंतिमकर्ता में एक डिस्पोज कॉल नहीं किया (जिसे ऑब्जेक्ट कचरा इकट्ठा किया जाता है) कहा जाता है - तो शायद निपटान करने के लिए कुछ भी नहीं है। –

उत्तर

15

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

यह अन्यथा काफी सरल यह करने के लिए अपनी खुद की विधि बनाने के लिए है:

public static class ExtensionMethods { 
    public static void Clear(this Control.ControlCollection controls, bool dispose) { 
     for (int ix = controls.Count - 1; ix >= 0; --ix) { 
     if (dispose) controls[ix].Dispose(); 
     else controls.RemoveAt(ix); 
     } 
    } 
    } 

अब आप लिख सकते हैं:

panel1.Controls.Clear(true); 
+1

आईआईआरसी, जब आप 'नियंत्रण 'का निपटान करते हैं, तो यह स्वचालित रूप से संबंधित' नियंत्रण चयन 'से नियंत्रण को हटा देता है, इसलिए आपको वास्तव में 'RemoveAt'' की आवश्यकता नहीं है (और एक 'IndexOutOfRangeException' के साथ समाप्त हो सकता है)। – Aaronaught

+0

हाँ ... कम से कम .NET 2 के लिए यह काम नहीं करेगा। लेकिन सवाल थोड़ा और है। क्या कोई "जोखिम" निपटान किए बिना "साफ़" कह रहा है? – serhio

+2

बेशक, आप नियंत्रण रिसाव करेंगे। क्या यह अन्य धागे से स्पष्ट नहीं था? –

0

"क्या खतरा है" सवाल, जोखिम का उत्तर देना (या जोखिम) खिड़की हैंडल से बाहर चल रहा है, हालांकि इसमें कुछ समय लग सकता है।

मेरे पास एक "विंडो डिजाइनर" है जो एक स्क्रिप्ट से एक विंडो उत्पन्न करता है। प्रत्येक बार जब मैं स्क्रिप्ट बदलता हूं, तो विंडो को पुनर्निर्मित किया जाता है (नियंत्रण साफ़ और पढ़ा जाता है)। एक विशेष रूप से जटिल खिड़की के साथ, और कई बार दर्जनों ताज़ा करने के बाद, Controls.Clear() का उपयोग करके, मुझे अंततः "कोई और खिड़की हैंडल" अपवाद नहीं मिलेगा और कोई और नियंत्रण बनाने में सक्षम नहीं होगा।

काफी आसान की तरह कुछ के साथ Controls.Clear() कॉल को बदलने के लिए: वहाँ एक कॉल finalizer में फेंक करने के लिए है, तो

Controls.Cast<Control>().ForEach(c => c.Dispose());