我创建了一个枢轴,可以动态下载并保存多个大图像。
我首先使用webclient下载映像并将其写入磁盘。
比创建一个包含所有图像的图像列表数组。
基本思想是仅在需要时才加载图像。
假设我的清单中有12张图片。数据透视图每张幻灯片仅显示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张图像)之后。它在以下行中抛出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));


并且内存似乎释放正确。

10-05 19:15