.net – Silverlight:来自流的BitmapImage抛出异常(灾难性故障(HRESULT异常:0x8000FFFF(E_UNEXPECTED)))

前端之家收集整理的这篇文章主要介绍了.net – Silverlight:来自流的BitmapImage抛出异常(灾难性故障(HRESULT异常:0x8000FFFF(E_UNEXPECTED)))前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要动态加载许多(有时数百个)缩略图.出于性能原因,我需要在有限数量的请求中执行此操作,我使用单个请求/响应进行测试.我正在为响应中的图像发送二进制数据,并使用MemoryStream将它们加载到Bitmap Image中.这正常工作,直到我加载超过约80个缩略图,然后我得到灾难性失败例外.为了确保我的数据没有损坏,我尝试使用相同的字节数组多次加载BitmapImage,并在80次左右加载后崩溃.

下面是一个如何从字节数组加载图像的示例,已知字节数组具有有效的图像数据(png):

private BitmapImage LoadImage(byte[] imageData)
{
    BitmapImage img = new BitmapImage();
    MemoryStream stream = new MemoryStream(imageData);
    img.SetSource(stream); // Exception thrown here after too many images loaded.
    return img;
}

然后我使用BitmapImage作为页面上Image元素的源,但错误发生在上面的img.SetSource(…)行中.

将GC.Collect()添加到我正在加载缩略图图像的循环中让我加载了更多图像,所以我认为这与内存管理有关但我不知道我能做些什么来解决问题.

解决方法

我认为引用微软在上述错误报告中提供的答案是值得的,因为它非常简洁,描述了问题并提供了推荐的解决方案:

When Silverlight loads an image,the framework keeps a reference and caches the decoded image until flow control is returned to the UI thread dispatcher. When you load images in a tight loop like that,even though your application doesn’t retain a reference,the GC can’t free the image until we release our reference when flow control is returned.

After processing 20 or so images,you could stop and queue the next set using Dispatcher.BeginInvoke just to break up the work that is processed in one batch. This will allow us to free images that aren’t retained by your application.

I understand with the current decode behavior it’s not obvIoUs that Silverlight is retaining these references,but changing the decoder design could impact other areas,so for now I recommend processing images like this in batches.

Now,if you’re actually trying to load 500 images and retain them,you are still likely to run out of memory depending on image size. If you’re dealing with a multi-page document,you may want to instead load pages on demand in the background and release them when out of view with a few pages of buffer so that at no point do you exceed reasonable texture memory limits.

猜你在找的Silverlight相关文章