- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要动态加载许多(有时数百个)缩略图。出于性能原因,我需要在有限数量的请求中执行此操作,我使用单个请求/响应进行测试。我正在发送响应中图像的二进制数据,并使用 MemoryStream 将它们加载到 BitmapImage 中。在我加载大约 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.
关于.net - Silverlight:流中的 BitmapImage 引发异常(灾难性失败(HRESULT 异常:0x8000FFFF (E_UNEXPECTED))),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6627164/
我有一种方法可以从 zip 文件中打开图像,并将该图像作为 BitmapImage 返回。 public BitmapImage GetImageFromSource() { using (S
这是我的代码 private async void OnGetImage(object sender, RoutedEventArgs e) { using
我正在尝试将图像的字节数组转换为 BitmapImage 以绑定(bind)到按钮。 public static BitmapImage GetBitmapImageFromByteArray(byt
我正在创建一个包含任意值的字节数组,并希望将其转换为 BitmapImage。 bi = new BitmapImage(); using (MemoryStream stream =
我可以像这样成功加载以下位图并将其显示在 View 上的图像控件中。 var bitmapImage = new BitmapImage {
我已经从文件流数据库中加载了一个图像列表。当我最初加载它们时,内存跳跃并没有那么大。当我在屏幕上显示它们时,我的内存使用量会激增,即使在我处理 BitmapImage 流源并将其设置为 Nothing
我正在开发 WP8 (Lumia 920) 的成像应用程序。我在 xaml 层中使用 C# 进行编码。 我在尝试在单独的任务中创建新的 BitmapImage 对象时遇到问题,该对象预计将使用由相机应
我有一个最初是 PNG 的图像,我已将其转换为 byte[] 并保存在数据库中。最初,我只是简单地将 PNG 读入内存流,然后将流转换为 byte[]。现在我想读回 byte[] 并将其转换为 Bit
我正在尝试将非常大的图像(大约 16000x7000 像素)加载到 Material 中,并且尝试异步加载它。我的第一个尝试是创建一个加载 BitmapImage 的任务,然后将其用于 Materia
我正在尝试从服务返回的字节数组创建一个BitmapImage。 我的代码是: using (sc = new ServiceClient()) { using (MemoryStream ms
我正在尝试将非常大的图像(大约 16000x7000 像素)加载到 Material 中,并且尝试异步加载它。我的第一个尝试是创建一个加载 BitmapImage 的任务,然后将其用于 Materia
我正在尝试从服务返回的字节数组创建一个BitmapImage。 我的代码是: using (sc = new ServiceClient()) { using (MemoryStream ms
我正在使用一个处理图像的 API,其中一种方法需要物理磁盘上文件的路径。 我遇到的问题是我通过 WCF 服务检索图像,因此图像已经存在于内存中。我不想将文件写入磁盘只是为了让此方法重新打开它并对其进行
我正在尝试在后台线程 (BackgroundWorker) 中创建一个 BitmapImage,但我的函数只立即返回 null,并且没有进入 Deployment.Current.Dispatcher
我用这段代码从网上获取图片 var image = new BitmapImage(); image.BeginInit(); image.CacheOption = BitmapCacheOptio
我试图通过每秒设置 source 属性来更新图像,这可行,但是在更新时会导致闪烁。 CurrentAlbumArt = new BitmapImage(); CurrentAlbumArt.Begin
我想旋转位图图像我写了一些代码,它可以工作 TransformedBitmap TempImage = new TransformedBitmap(); TempImage.BeginInit();
我有一组原始像素数据。我想将其转换为 8bpp 位图。 public static Bitmap ByteToGrayBitmap(byte[] rawBytes, int width, int he
我正在尝试使用以下代码将 MemoryStream 转换为 Image。 Stream stream = new MemoryStream(bytes); BitmapImage bitmap
我有一个应用程序,它从 XML 文件中读取 JPEG(到字节数组),生成 MemoryStreams 并使用它们来实例化 BitmapImages。 JPEG 的整个大小约为 60 MB。但是,我的应
我是一名优秀的程序员,十分优秀!