<bitmapimage> .SetSource()</bitmapimage>中的OutOfMemory异常

时间:2013-02-16 18:24:19

标签: c# windows-phone-8

我创建了一个动态下载并保存多个大图像的数据透视表。 我首先使用webclient下载映像并将其写入磁盘。 而不是创建一个包含所有图像的图像列表数组。 基本思想是我只在需要时加载图像。 假设我的列表中有12个图像。 Pivot每张幻灯片只显示1张图片。假设我们正在查看图像7.我继续预加载图像6&amp; 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左右显示 发生了什么?记忆不应该被释放吗?

1 个答案:

答案 0 :(得分: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));

内存似乎正确释放。