網上查到的代碼,多數的寫法使用MemoryStream來實現:
復制代碼 代碼如下:
new Thread(new ThreadStart(() => {
var bitmap = new BitmapImage();
bitmap.BeginInit();
using (var stream = new MemoryStream(File.ReadAllBytes(...))) {
bitmap.StreamSource = stream;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.EndInit();
bitmap.Freeze();
}
this.Dispatcher.Invoke((Action)delegate {
Image1.Source = bitmap;
});
})).Start();
今天問題來了,當我設置了DecodeWidth為100時加載1000張圖片,照理說內存應該維持100×100的1000張圖片,但事實上他保留了所以原始圖片的內存直到BitmapImage被回收時才釋放,這讓我很尴尬,換句話說using(MemoryStream)並沒有真正按我們預期釋放MemoryStream中的Buffer,那如何才能釋放呢?
其實最簡單就是直接棄用MemoryStream轉投FileStream,如下:
復制代碼 代碼如下:
using (var stream = new FileStream(path, FileMode.Open)) {
image.BeginInit();
image.StreamSource = stream;
image.DecodePixelWidth = 100;
image.CacheOption = BitmapCacheOption.OnLoad;
image.EndInit();
image.Freeze();
}