我创建了一个可以动态下载并保存多个大图像的枢轴。我首先使用 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 张图像)。它在以下行中引发 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
。
发生了什么?不应该释放内存吗?