2013-02-16 66 views
3

我創建了一個動態下載並保存多個大圖像的數據透視表。 我首先使用webclient下載圖像並將其寫入磁盤。 比創建一個包含所有圖像的圖像列表數組。 基本思想是我只在需要時才加載圖像。 說我的清單中有12張圖像。每張幻燈片只顯示1個圖像。假設我們正在查看圖片7.我繼續爲下一張幻燈片預加載圖片6 & 8。OutOfMemory異常<BitmapImage> .SetSource()

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圖像)。它會在該行中引發OutOfMemory異常:bi.SetSource

我檢查了卸載功能都工作正常(它不釋放內存調用收集後,和內存保持在一個穩定的點)

但它仍然拋出一個異常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
發生了什麼?不應該釋放內存?

+0

請對[格式](http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks)更敏感 – 2013-02-16 18:26:24

+0

對不起,我正在使用我的手機發布。它沒有預覽給我,我輸入了四個空格代碼。但事實證明它並不起作用:\ – user1510539 2013-02-16 18:29:28

+1

這可能不是泄漏的根源,但您應該確保在加載圖片後關閉流:'使用(var stream = GetStream(fileName)){bi .SetSource(流); }' – 2013-02-16 19:20:48

回答

1

我最終設置了一個空的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)); 

而且記憶似乎釋放正確。

+0

而不是1x1 GIF,您可以使用假圖片並捕獲異常:http://stackoverflow.com/a/13482619/869621 – 2013-02-17 09:14:41

+0

另外,如果您不介意,是否可以嘗試將UriSource設置爲null在這裏:http://stackoverflow.com/a/13963747/869621,看看它的工作原理? – 2013-02-17 09:24:38

+0

我試圖使用新的字節[] {0x0},但它給我一個執行。所以這就是我使用1x1 GIF的原因。 – user1510539 2013-02-17 09:29:39