2011-07-10 10 views
8

अगर मैं एक ManagementObjectSearcher उपयोग कर रहा हूँ, मैं आसानी से यह एक using ब्लॉक में लपेट कर सकते हैं:नेट डब्लूएमआई कक्षाएं - मुझे किसको निपटान करना है?

using (var searcher = new ManagementObjectSearcher(scope, query)) 
{ 
    // ... 
} 

यह भी आसान the collection returned from the searcher निपटान के लिए, इस तथ्य के कारण है कि foreach automatically calls dispose on the enumerator:

using (var searcher = new ManagementObjectSearcher(scope, query)) 
{ 
    foreach(ManagementObject mo in searcher.Get()) 
    { 
     // ... 
    } 
} 

लेकिन ManagementObjectIDisposable लागू करता है:

using (var searcher = new ManagementObjectSearcher(scope, query)) 
{ 
    foreach(ManagementObject mo in searcher.Get()) 
    { 
     // ... 

     mo.Dispose(); // ? 
    } 
} 
  • क्या मुझे इस परिदृश्य में प्रत्येक ManagementObject उदाहरण वापस लेना है?
  • यदि मैं करता हूं, तो मैं इसे अपवाद सुरक्षित कैसे बना सकता हूं?
  • क्या कोई तरीका है कि मैं अभी भी इस परिदृश्य में लिंक का उपयोग कर सकता हूं (और अभी भी Dispose पर ठीक से कॉल करें)? खासकर searcher.Get().First() जैसे निर्माण के साथ?

संपादित: कुछ और संबंधित प्रश्नों:

  • मैं भी खोज परिणाम संग्रह पर Dispose कॉल करने के लिए है?
  • खोजकर्ता के बारे में कैसे?

वे दोनों भी, अपने स्वयं के IDisposable तरीका लागू हालांकि यह खोजकर्ता की तरह लगता है केवल Component से Dispose कार्यान्वयन विरासत में; यह अपने स्वयं के निपटान व्यवहार को जोड़ता नहीं है।

System.ComponentModel.Component और you should call Dispose explicitly सभी के लिए से

उत्तर

3

ManagementObject inherits Component वस्तुओं से विरासत में मिली। आप अपनी खुद की विधेय जो Dispose खुद का आह्वान साथ LINQ तरीकों का उपयोग कर सकते हैं:

var first = searcher.Get().First(x => 
       { 
        bool result = Satisfy(x); 

        if (!result) 
        { 
         x.Dispose(); 
        } 

        return result; 
       }); 

इस कोड के बराबर है:

ManagementObject first = null; 

foreach (var element in searcher.Get()) 
{ 
    if (Satisfy(element)) 
    { 
     first = element; 
     break; 
    } 
    else 
    { 
     element.Dispose();  
    } 
} 

if (first == null) 
{ 
    throw new InvalidOperationException("No match"); 
} 

कहाँ Satisfy अपनी खुद की विधि है।

+0

आपके उत्तर देने के बाद मेरे प्रश्न को बुलाने के लिए खेद है। कृपया मेरे संपादन देखें। आप नीचे दिए गए शब्दकोष का जिक्र करते हैं जो कहता है कि आपको हमेशा 'घटक' से प्राप्त कक्षाओं पर 'निपटान' को कॉल करना चाहिए। हालांकि, क्या इस वर्ग के लिए कोई कारण है जो अपना स्वयं का 'निपटान' कार्यान्वयन नहीं जोड़ता है? मैं प्रतिबिंबक से देखता हूं कि 'घटक 'पर' निपटान 'की गड़बड़ी में कुछ रोचक चीजें हैं, लेकिन ऐसा लगता है जैसे यह केवल तभी लागू होगा जब मैंने इसे किसी प्रकार के" साइट "संदर्भ में उपयोग किया हो। मैं यह नहीं बता सकता कि क्या इस मामले में लागू होता है ... –

+0

इसे चेक किया गया, और 'साइट' शून्य लगता है। मैं घटनाओं को निपटाने के लिए बाध्यकारी नहीं हूं, इसलिए ऐसा लगता है कि यह इस मामले में कुछ भी नहीं करेगा। लेकिन मैं आपके दो सेंट की सराहना करता हूं। –

+1

मुझे लगता है कि निम्नलिखित ढांचे डेवलपर्स सिफारिशें एक अच्छी प्रथा है। वास्तव में, आपको कोड के इस संस्करण को वास्तव में कैसे काम करता है इस बारे में कोई अनुमान या धारणा बनाने के लिए परावर्तक या अन्य किसी भी चीज़ का उपयोग नहीं करना चाहिए। एमएसडीएन में माइक्रोसॉफ्ट लिखता है कि आपको 'घटक' से विरासत में मिली प्रत्येक वस्तु के लिए 'निपटान' को कॉल करना होगा। यदि आपको कुछ जटिल उपयोग-मामले या ढांचे के आगे के संस्करणों में समस्याएं नहीं मिल सकती हैं।विनिर्देशों को अनदेखा करना पहली बात है क्योंकि एप्लिकेशन ओएस या फ्रेमवर्क के नए संस्करण में विफल रहता है। – oxilumin

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