2011-05-26 4 views
6

का निपटान करें I StreamResourceInfo.Stream का उपयोग संसाधनों से BitmapImage एस प्राप्त करने के लिए करें। क्या इसका उपयोग करने के बाद Close और Dispose स्ट्रीम सही है? मैं पूछता हूं क्योंकि मेमोरी प्रोफाइलर में, अगर ऐसा होता है तो मुझे एक त्रुटि मिलती है। मेमोरी प्रोफाइलर का कहना है कि एक डिस्पोजेड उदाहरण जीसीड नहीं किया गया है।StreamResourceInfo.Stream

यदि मैं वेब पर देखता हूं, तो मुझे केवल इस विषय पर this पोस्ट मिल सकता है। इस पोस्ट में, प्रतिक्रिया देने वाला व्यक्ति कहता है, कि निपटान करना मतलब है। हालांकि अगर मैं परिस्थितियों और प्रभाव पर ध्यान देता हूं, तो मुझे नहीं लगता कि यह सही है। क्या कोई जानता है कि सही कार्रवाई क्या है?
अतिरिक्त जानकारी: मैंने देखा है msdn उदाहरणों में, वे निपटान या बंद नहीं करते हैं।

संपादित
रिक Sladkeys जवाब देने के लिए धन्यवाद, मैं समाधान नहीं मिला: मैं BitmapImage की StreamSource -property को StreamResourceInfo.Stream आवंटित। msdn में लिखा गया है:

बिटमैप कैशऑप्शन पर कैशऑप्शन प्रॉपर्टी सेट करें। अगर आप बिटमैप छवि के निर्माण के बाद स्ट्रीम को बंद करना चाहते हैं तो ऑनलोड करें। डिफ़ॉल्ट ऑनडेमांड कैश विकल्प बिटमैप की आवश्यकता होने तक स्ट्रीम तक पहुंच को बरकरार रखता है, और कचरा कलेक्टर द्वारा क्लीनअप को संभाला जाता है।

इसका मतलब है, BitmapImage स्ट्रीम का स्वामित्व लेता है। और यही कारण है कि अगर मैं स्ट्रीम को मैन्युअल रूप से बंद/डिस्प्ले करता हूं तो स्मृति प्रोफाइलर एक त्रुटि दिखाता है: बिटमैप स्ट्रीम (बिटमैप कैशऑप्शन ऑन डिमांड) का संदर्भ रखेगा और इसलिए जीसी इसे तब तक रिलीज़ नहीं करेगा जब तक कि बिटमैप छवि वैध नहीं है, लेकिन स्ट्रीम पहले से ही स्पष्ट रूप से है निपटाए। इस विशिष्ट उदाहरण में, निपटान एक बुरा विचारधारा है।
पूर्णता के लिए, मैंने उपर्युक्त लिंक के उदाहरण के लिए msdn में भी देखा है जहां TextRange.Load कहा गया था। Load के लिए, यह विपरीत है, Load स्वामित्व नहीं लेता है और इसलिए स्ट्रीम को समाप्त होने के बाद बंद/डिस्पोजेड किया जाना चाहिए।

+0

धाराओं पर 'निपटान' आंतरिक रूप से 'बंद' कॉल करता है। (या वास्तव में आमतौर पर अन्य तरीकों से) –

+0

@ एल्बिन: हाँ मुझे इसके बारे में पता है। यहां AFAIK बंद कॉल का निपटान करें। लेकिन यह सवाल नहीं है। सवाल यह है कि, यदि यह विशिष्ट स्ट्रीम को बंद/निपटाना भी चाहता है। एमएसडीएन-उदाहरणों में वे नहीं करते हैं और यदि मैं परिणाम देखता हूं, तो मुझे संदेह है कि यह previed/अपेक्षित है। लेकिन फिर भी धन्यवाद। – HCL

उत्तर

10

भ्रम, और मैं मानता हूं कि यह भ्रमित है, स्वामित्व की स्वामित्व वाली महत्वपूर्ण अवधारणा से आता है। एमएसडीएन उदाहरणों में आप उन्हें देख सकते हैं "देखो, नहीं Dispose, Close, तो मुझे ऐसा नहीं करना चाहिए?"

लेकिन सरल जवाब यह है कि किसी को स्ट्रीम को बंद करने के लिए ज़िम्मेदार होना चाहिए। एपीआई आप शायद बुला रहे हैं:

  • Application.GetResourceStream

एक StreamResourceInfo एक धारा और एक URL के लिए एक आदिम कंटेनर है कि देता है। स्पष्ट रूप से StreamResourceInfo स्ट्रीम का मालिक नहीं है। तो जब आप Application.GetResourceStreamपर कॉल करते हैं तो आप उस StreamResourceInfo में मौजूद स्ट्रीम का स्वामी हैं और यदि आपने इसके साथ कुछ और नहीं किया है, तो आप इसे बंद करने के लिए जिम्मेदार होंगे। Application एपीआई ने हमारे लिए एक मूल्य के रूप में इसे वापस करके स्ट्रीम से स्वामित्व को स्वामित्व में स्थानांतरित कर दिया।

अब भ्रमित करने वाला हिस्सा आता है जब आप स्ट्रीम को किसी अन्य इकाई में पास करते हैं।चलो एक MSDN उदाहरण लेते हैं:

// Navigate to xaml page 
Uri uri = new Uri("/PageResourceFile.xaml", UriKind.Relative); 
StreamResourceInfo info = Application.GetResourceStream(uri); 
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader(); 
Page page = (Page)reader.LoadAsync(info.Stream); 
this.pageFrame.Content = page; 

अब इस उदाहरण में कोई Dispose और कोई Close। लेकिन हमारे (कॉलर) से XamlReader उदाहरण से स्ट्रीम के स्वामित्व के हस्तांतरण का हस्तांतरण है। धारा अब हमारी ज़िम्मेदारी नहीं है; हमने स्वामित्व किसी और के पास पारित कर दिया है। वास्तव में, XamlReader स्ट्रीम के साथ किए जाने पर Close पर कॉल करता है। एक रहस्य हल हो गया।

कारण यह इतना समस्याग्रस्त है कि स्वामित्व की अवधारणा आम तौर पर दस्तावेज में निहित है और हम करने वाले हैं कि "सिर्फ यह पता लगा।" उम्मीद है कि सिर्फ स्वामित्व की वें अवधारणा और तथ्य यह है कि यह हस्तांतरणीय यह आसान आरामदायक नहीं बुला Close सुरक्षा है कि नए मालिक होगा साथ महसूस करने के लिए कर देगा है की समीक्षा। और यदि वे नहीं करते हैं, तो यह अब हमारी समस्या नहीं है!