【问题标题】:System.Windows.Media.Imaging.WriteableBitmap leaking memory?System.Windows.Media.Imaging.WriteableBitmap 泄漏内存?
【发布时间】:2015-11-24 16:25:57
【问题描述】:

考虑以下代码抛出异常'MILERR_WIN32ERROR':

while(true)
            {
                System.Windows.Media.Imaging.WriteableBitmap writableBitMap =
                                    new System.Windows.Media.Imaging.WriteableBitmap(100, 200, 96, 96, System.Windows.Media.PixelFormats.Bgra32, null);
            }

WriteableBitmap 没有实现 IDisposable,我完全不知道为什么会发生内存泄漏(我的原始代码要复杂得多,我对此进行了跟踪)。

【问题讨论】:

  • 你的目标是什么版本的 vs 和什么版本的 .net 框架?
  • 这段代码应该没问题(嗯......记住它在无限循环中,我知道原始代码中不存在)。在对您的错误进行快速搜索后,似乎是由大量图像对象引起的。因此,我想您应该查看其余代码中发生的情况。据我了解,您知道此 while(true) 是一个无限循环(您的实际代码应该在该循环中包含某些内容以在某些时候将其中断,否则您有错误的原因)。
  • 我正在尝试编写一个程序,它逐帧读取视频文件并将这些帧均匀地混合在一起,代码基本上是通过一个视频文件并读取每一帧,将其写入writeablebitmap,将它插入另一个,然后继续到下一帧,当它用完要读取的视频帧时终止。我想我可以考虑尝试将多组帧组合在一起以加快速度。
  • 您的意图很好,但发布的代码没有这样做。您发布的代码是一遍又一遍地实例化 WriteableBitmaps 而不会停止。读取文件时,循环会自动退出,因为给定的条件会告诉它们。使用 while(true) 您必须始终设置退出条件,否则循环将永远继续(更好:直到程序崩溃)。
  • @varocarbas 这没有意义,即使我无限循环并创建可写位图也不应该出现内存不足崩溃,垃圾收集器应该介入并确保在可写位图超出范围。代码 sn -p 足以说明内存问题。

标签: c# memory-leaks writeablebitmap writeablebitmapex system.windows.media


【解决方案1】:

内存泄漏问题源于 BitmapSource 的内存泄漏。谷歌搜索会发现更好的结果:)

This 表示,一旦你使用了 writableBitMap,就应该将它分配给“null”。我会说在将其分配给 null 之前尝试使用 Freeze() 方法,然后尝试。如果在那之后,如果你看到内存泄漏仍然存在,disable the caching option (CacheOption) 通过将其设置为 BitmapCacheOption.OnLoad。

【讨论】:

  • 没有用,并且您拥有的其他 stackoverflow 链接用于不同的类,writeablebitmap 没有缓存选项:(
  • 谷歌搜索这让我相信这是一个已知问题,可写位图只是泄漏内存,似乎没有明显的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2013-01-20
  • 2011-10-31
  • 2019-08-10
  • 2013-06-24
  • 2011-03-22
  • 2015-04-20
相关资源
最近更新 更多