gpt4 book ai didi

c# - .SetSource() 中的 OutOfMemory 异常

转载 作者:行者123 更新时间:2023-11-30 17:55:36 26 4
gpt4 key购买 nike

我创建了一个动态下载和保存多个大图像的枢轴。我首先使用 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

我检查了unload函数是否正常工作(它在调用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));

并且内存似乎已正确释放。

关于c# - <BitmapImage>.SetSource() 中的 OutOfMemory 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14913604/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com