इस व्यवहार पर कुछ पृष्ठभूमि जानकारी: बिटमैप बिटमैप में पिक्सल पहुँचने के लिए एक स्मृति-मैप की गई फ़ाइल का उपयोग करता है। विंडोज एपीआई में यह एक बहुत ही बुनियादी सुविधा है, यह डेटा को फाइल करने के लिए स्मृति के बहुत कुशल मैपिंग की अनुमति देता है। डेटा केवल फ़ाइल से पढ़ा जाता है जब प्रोग्राम मेमोरी पढ़ता है, वर्चुअल मेमोरी पेज विंडोज पेजिंग फ़ाइल में कोई स्थान नहीं लेते हैं।
सटीक उसी तंत्र का उपयोग .NET असेंबली को लोड करने के लिए किया जाता है। यह स्मृति मैपिंग है जो फ़ाइल पर लॉक रखती है। जो मूल रूप से एक .NET प्रोग्राम में उपयोग किए जाने पर असेंबली लॉक हो जाती है। Image.Dispose() विधि लॉक जारी करती है। लॉक से लड़ने से अक्सर संकेत मिलता है कि आप अपने बिटमैप्स का निपटान करना भूल रहे हैं। बहुत महत्वपूर्ण बात यह है कि निपटान करना भूलना() अक्सर बिटमैप को छोड़कर .NET कक्षाओं के लिए समस्याएं उत्पन्न नहीं करता है क्योंकि इसे बहुत अधिक (अप्रबंधित) स्मृति की आवश्यकता हो सकती है।
हां, FromStream() कक्षा को इस अनुकूलन से रोकता है। लागत महत्वपूर्ण है, बिटमैप लोड होने पर आपको स्मृति को दोगुनी करने की आवश्यकता होगी। बिटमैप बड़ा होने पर यह एक समस्या होगी, जब आप थोड़ी देर के लिए चल रहे हैं (पता स्थान को खंडित कर रहे हैं) और यह 64-बिट ऑपरेटिंग सिस्टम पर नहीं चल रहा है, तो आप ओओएम स्कर्ट कर रहे हैं। निश्चित रूप से ऐसा करने से बचें यदि बिटमैप की चौड़ाई x ऊंचाई x 4> = 45 एमबी, दे या ले लो।
कुछ कोड, आप CopyStream घेरा के माध्यम से कूद करने की जरूरत नहीं है:
public static Image LoadImageNoLock(string path) {
var ms = new MemoryStream(File.ReadAllBytes(path)); // Don't use using!!
return Image.FromStream(ms);
}
ध्यान दें कि आप MemoryStream निपटान के लिए नहीं करना चाहते हैं, तो आप एक कठिन "सामान्य त्रुटि" निदान करने के लिए मिल जाएगा जब आप करते हैं तो बिटमैप का उपयोग किया जाता है। छवि वर्ग आलसी-स्ट्रीम पढ़ने के कारण।
स्रोत
2010-08-02 15:18:37
आपको बिटमैप प्राप्त करने के लिए भी इसकी आवश्यकता है। बिटमैप बिटमैप = नया बिटमैप (लोड इमेज नॉकॉक (पथ)); – Harris
मेमोरीस्ट्रीम डिस्पोजेबल है, जो इस समाधान में इसे निपटाने का ख्याल रखेगा? – kwesolowski