本文告诉大家一个最简单步骤让 RenderTargetBitmap 出现 COMException 提示
只需要在界面添加一个 ListView 绑定图片,然后在后台不断刷新列表就可以
在后台创建 DeagernereDechuno 列表
在 Load 之后调用函数 WarwairJorkasou 不断截图
在 WarwairJorkasou 调用循环进行截图,很快就可以看到下面提示
异常堆栈
截图的代码
运行程序大概在 300M 左右就会出现 COMException 提示
RenderTargetBitmap throws COM exception when created too fast: MILERR_WIN32ERROR (Exception from HRESULT: 0x88980003)
代码请看 https://github.com/dotnet-campus/wpf-issues/tree/master/RenderTargetBitmapThrowsCOMExceptionWhenCreatedTooFast
已经报告官方,请看 Known issus: WPF will throw COM Exception when create RenderTargetBitmap too fast · Issue #3067 · dotnet/wpf
在 WPF 里面炸掉的代码如下
从上面代码可以看到是调用 COM 炸了,也就是修框架层还是解决不动
有小伙伴 elyoh 告诉我,也许是 GDI 对象的问题,这个方法每次都需要申请一定量的 GDI 对象,但是这个方法没有立刻释放这些 GDI 资源。通过 GDI Objects 文档可以知道,限制每个会话能打开的 GDI 对象是 65535 个,在注册表中设置了每个进程可以注册 10,000 个,一个可以让程序跑得更远的方法是不断调用垃圾回收,尽管这个调用会降低性能
但实际上小伙伴说的内容不对,原因是这个进程没有使用那么多的 GDI 对象,通过任务管理器可以看到
原文链接: http://blog.lindexi.com/post/WPF-%E4%BD%BF%E7%94%A8-RenderTargetBitmap-%E5%BF%AB%E9%80%9F%E6%88%AA%E5%9B%BE%E5%87%BA%E7%8E%B0-COMException-%E6%8F%90%E7%A4%BA
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。