簡體   English   中英

OutOfMemory Exception in <BitmapImage> .SetSource()

[英]OutOfMemory Exception in <BitmapImage>.SetSource()

我創建了一個動態下載並保存幾個大圖像的數據透視表。 我首先使用webclient下載映像並將其寫入磁盤。 而不是創建一個包含所有圖像的圖像列表數組。 基本思想是我只在需要時加載圖像。 假設我的列表中有12個圖像。 Pivot每張幻燈片只顯示1張圖片。 假設我們正在查看圖像7.我繼續為下一張幻燈片預加載圖像6和8。

1, 2, 3, 4, 5, [6, {7}, 8], 9, 10, 11, 12

當用戶瀏覽幻燈片時,我將圖像預先加載到“[]”之外並卸載。

我用來預加載圖片的代碼:

BitmapImage bi = new BitmapImage();
bi.SetSource(GetStream(fileName);
IMGSource = bi; // IMGSource<ImageSource> referenced by the xaml in Image Binding IMGSource.

我用來卸載圖片的代碼:

IMGSource = null;
GC.Collect(); // I force the program to Garbage collect since the image is really large.

問題是,在觀看了幾張圖像后(大約9張圖像)。 它會在行中bi.SetSource一個OutOfMemory異常: bi.SetSource

我檢查了卸載功能是否正常工作(它在調用Collect后釋放內存,並且內存保持穩定點)

但它仍然會拋出OutOfMemory異常。 我該怎么辦?

編輯:
我剛剛發現記憶實際上一直在上升
瀏覽幻燈片時。 致電:

Microsoft.Phone.Info.DeviceStatus.ApplicationCurrentMemoryUsage;

它給人的回憶如下:

54.7 MB, 76.91 MB, 111.94 MB, 105 MB, 112.71 MB, 141.93 MB, 148.42 MB, Exception thrown

但是通過電話:

GC.GetTotalMemory(false);

它僅顯示在1.2~1.3 MB左右。
發生了什么? 內存不應該被釋放嗎?

我最終設置了一個空的1x1透明GIF到圖像源釋放內存。

public static byte[] EMPTY_IMAGE = new byte[]{
    71, 73, 70, 56, 57, 97, 1, 0, 1
    , 0, 128, 0, 0, 255, 255, 255
    , 0, 0, 0, 33, 249, 4, 1, 0, 0
    , 0, 0, 44, 0, 0, 0, 0, 1, 0, 1
    , 0, 0, 2, 2, 68, 1, 0, 59
};

然后使用:

bi.SetSource(new System.IO.MemoryStream(MYCLASS.EMPTY_IMAGE));

內存似乎正確釋放。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM