:
var bitmap = new BitmapImage();
var stream = File.OpenRead(imageFilePath);
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.StreamSource = stream;
bitmap.EndInit();
stream.Close();
stream.Dispose();
वैकल्पिक रूप से, यह भी BitmapImage फ्रीज मेरी स्थिति में ऐसा लगता है कि बिटमैप कैशिंग मुद्दा था। मैं पहले इस तरह बिटमैप लोड हो रहा था:
Bitmap bitmap = new Bitmap();
using(var stream = new FileStream(...))
{
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.StreamSource = stream;
bitmap.EndInit();
}
bitmap.Freeze();
image.Source = bitmap;
लगातार image.Source
उसी तरह सिर्फ स्मृति का निर्माण किया, मैन्युअल रूप से कचरा संग्रहण वास्तव में मदद नहीं कर रहा था के लिए मजबूर की जगह।
इसके बजाय, कैशिंग को अक्षम करने और इसे स्ट्रीम का उपयोग करने के लिए (छवि को प्रदर्शित होने तक स्ट्रीम को खोलने की आवश्यकता होती है) मैन्युअल कचरा संग्रह के साथ जोड़ा गया स्मृति मेरे लिए मेमोरी का निर्माण समाप्त हो गया।
Stream mediaStream;
void DisposeMediaStream()
{
if (mediaStream != null)
{
mediaStream.Close();
mediaStream.Dispose();
mediaStream = null;
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true);
}
}
void Update()
{
DisposeMediaStream();
var bitmap = new BitmapImage();
mediaStream = new FileStream(...);
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.None;
bitmap.StreamSource = mediaStream;
bitmap.EndInit();
bitmap.Freeze();
ControlImage.Source = bitmap;
}
इस तरह से मैं कई छवियों (जैसे विंडोज फोटो व्यूअर) के माध्यम से चक्र कर सकता हूं और स्मृति कम रहता है। ध्यान दें कि छवि वास्तव में प्रस्तुत होने के बाद स्ट्रीम को खुला रहने की आवश्यकता नहीं है।
हां यह पुराने दिनों में मेरे लिए काम करता था। – AgentFire
ग्रेट उत्तर, धन्यवाद। मुझे बहुत मदद की। – MDDDC