最近遇到WPF程序抛出ystem.Runtime.InteropServices.COMException异常,异常消息UCEERR_RENDERTHREADFAILURE (Exception from HRESULT: 0x88980406),或者先在D3DImage.Lock卡死,然后再出异常的问题。

现象和复现方法

出现了标题中的现象,你很可能有至少两个屏幕,并且可能在你的程序中直接或间接用了如下的库或技术:

1、WpfD3D这个开源库

2、自行使用了WPF中的D3DImage类,实现D3D渲染

3、以任意方式在WPF中使用了D3D

复现的的方法:按Win+P,在出现的投影菜单中选择“仅第二屏幕”,之后渲染就会停止,通常整个程序也会卡死,多重复几次Win+P选择其他选项,或者随便点击程序的UI,就会抛出ystem.Runtime.InteropServices.COMException异常,异常的描述是UCEERR_RENDERTHREADFAILURE (Exception from HRESULT: 0x88980406)。

原因分析

看了好多篇文章,多数都指向微软的这篇文章,并且按照这篇文章排查问题:

WPF render thread failures

概述一下这篇文章的内容,主要说了这几个点:

1、渲染不是在主线程实现的,而是独立的渲染线程完成的,主线程告诉渲染线程该绘制什么

2、你可能遇到一些什么渲染异常,包括System.Runtime.InteropServices.COMException、System.InvalidOperationException和System.OutOfMemoryException

3、你通常都会发现在出现异常的时候,调用堆栈是固定的一些位置,然而调用堆栈并没什么卵用(原文就是这样说的:Render thread failures will generate one of the calls stacks shown above (or a minor variation thereof) regardless of the root cause)

4、建议你检查有没有内存泄漏、升级.Net FrameWork、升级系统等等

最终的结论是,渲染线程崩溃是很难查的问题,因为在主线程收到异常的时候,渲染线程已经已经已经已经挂掉了……

直到我看到了这一篇文章:

wpf D3DImage 偶现性无法渲染图像,D3D设备丢失的解决办法

标题的【D3D设备丢失】很重要。文章的作者是安装了向日葵,但是还不是本质的原因,他描述了D3D设备丢失这个最核心的原因。微软的论坛也有人反馈这个问题

D3DImage losing its D3DDevice

我没有仔细去看为什么D3D设备会丢失,估计是因为Win+P选择了“仅第二屏幕”,Windows的显示机制重置了很多东西,主屏幕临时变成了第二屏,注意如果改回其他模式,主屏幕还是会变回第一屏,也就是说Windows对“仅第二屏幕”这个选项做了特殊处理,可能正是因为这个特殊处理,才导致D3D设备都失效了。

解决方法

知道是D3D设备失效就好办了,如果能让代码知道是什么时候失效的,重建D3D的对象就可以了。D3DImage类有IsFrontBufferAvailableChanged事件,注册这个事件,在事件触发时重新创建D3D的相关对象即可。

已经改好的WpfD3D库

WpfD3D修复多个缺陷(项目实际在用)

这个是我一直在用的WpfD3D库,源自开源的版本,但是也经过我改造了很多,包括修复了一些缺陷,增加了接口可以做D3DRenderSource和WriteableRenderSource的动态加载和动态切换等。对于这次的问题,核心的修改就是在D3DRender\D3DImageSource.cs文件的749-791行:

        private void OnIsFrontBufferAvailableChanged(object sender, DependencyPropertyChangedEventArgs e){// 判断硬件渲染支持int level = RenderCapability.Tier >> 16;bool useSoftRender = level == 0;// 软件渲染判断IsFrontBufferAvailable没意义if (!useSoftRender){if(!imageSource.IsFrontBufferAvailable){return;}}if (textureSurface != null){lock(renderLock){// 重新创建D3D的对象,修复多屏切换(Win+P选择仅第二屏)时出现// System.Runtime.InteropServices.COMException异常,异常信息// UCEERR_RENDERTHREADFAILURE (异常来自 HRESULT:0x88980406)ReleaseResource();// 增加try-catch预防D3D内部发出的无效调用异常try{dummyWindow?.Close();dummyWindow = new Form();hwnd = dummyWindow.Handle;InitD3D();Format d3dFormat = ConvertToD3D(frameFormat);CreateResource(d3dFormat, yWidth, yHeight);}catch(Exception ex){ErrorOccur = true;LastException = ex;}}}}

【WPF】渲染失败甚至程序崩溃,D3DImage.Lock卡死,报COMException异常和UCEERR_RENDERTHREADFAILURE消息相关推荐

  1. 程序闪退怎么运行_苹果应用程序崩溃闪退怎么办?如何解决苹果设备的软故障?...

    你们在使用苹果设备的时候是不是经常遇到程序卡死,或者苹果设备假死的情况?如果您遇到程序崩溃闪退或报错的时候,请不要慌张,按照以下方法解决问题. 苹果设备 它是应用程序问题还是设备故障? 首先,您必须弄 ...

  2. adb.exe可能被其他程序关闭_苹果应用程序崩溃闪退怎么办?如何解决苹果设备的软故障?...

    你们在使用苹果设备的时候是不是经常遇到程序卡死,或者苹果设备假死的情况?如果您遇到程序崩溃闪退或报错的时候,请不要慌张,按照以下方法解决问题. 苹果设备 它是应用程序问题还是设备故障? 首先,您必须弄 ...

  3. 记一次 .NET 某医疗器械 程序崩溃分析

    一:背景 1.讲故事 前段时间有位朋友在微信上找到我,说他的程序偶发性崩溃,让我帮忙看下怎么回事,上面给的压力比较大,对于这种偶发性崩溃,比较好的办法就是利用 AEDebug 在程序崩溃的时候自动抽一 ...

  4. Windows 7 应用程序崩溃恢复

    从Vista 到Windows 7 这两款操作系统都带有应用程序恢复和重启(ARR)功能,利用这个特性可以在应用程序处于无响应甚至崩溃状态时,保存当前正在处理的数据,并将应用程序以及之前的数据恢复.本 ...

  5. 译 | Azure 应用服务中的程序崩溃监控

    点击上方蓝字关注"汪宇杰博客" 原文:Yun Jung Choi, Puneet Gupta 翻译:汪宇杰 应用程序崩溃经常发生.崩溃是指代码中的异常未得到处理并终止进程.这些未处 ...

  6. 三星s7不能运行java_在调试模式下启动时Android应用程序崩溃

    当我在 debug 模式下运行时,应用程序崩溃了,但是当我正常运行它时它会起作用 . 我认为附加调试器时会出现问题 . 日志: A/art: art/runtime/jdwp/jdwp_event.c ...

  7. C ++标准是否允许未初始化的bool使程序崩溃?

    本文翻译自:Does the C++ standard allow for an uninitialized bool to crash a program? I know that an " ...

  8. 想要避免After Effects渲染失败的问题,5个小技巧必看

    Adobe After Effects是由 Adob​e Systems 开发的数字视觉效果.动态图形和合成应用程序,用于电影制作.视频游戏和电视制作的后期制作过程.有时,我们不得不面对项目在 Aft ...

  9. 应用程序崩溃定位查找 (二)

    教程的第一部分介绍了 SIGABRT 和 EXC_BAD_ACCESS 的错误,并说明解决他们使用 Xcode 调试器和异常断点的一些策略. 但我们的应用程序仍然有一些问题!它不能完全按照它应该并且有 ...

最新文章

  1. mysql 软件导出导入数据_MySQL 之 导出导入数据
  2. Java中ArrayList最大容量为什么是Integer.MAX_VALUE-8?
  3. 统计日志中ip访问次数并排序的三种方法
  4. 一篇文章教你学会使用SpringBoot实现文件上传和下载
  5. java 加载class文件路径_动手实现MVC: 1. Java 扫描并加载包路径下class文件
  6. 实例29:python
  7. IDEA全文搜索排除无用的文件夹
  8. 李航《统计学习方法》之HMM隐马尔可夫模型
  9. CentOS下使用rpm-build制作nginx的RPM包
  10. linux内核源代码_如何从源代码构建和安装最新的Linux内核
  11. 第一款Micropython图形化编辑器—Python Editor
  12. Could not retrieve transaction read-only status from server
  13. 海外硕士苏明哲回国后哀叹:我美本英硕,找不到工作很难受
  14. mysql的学生信息建表语句_SQL语句创建学生信息数据库表的示例
  15. sql语句练习 - 增删改查
  16. PS修皮肤去痘痘毛孔,只需要掌握这个技巧就够了
  17. 老工程师10年c语言总结,一位老电子工程师十年感悟:环顾四周,也没见几个有出息的!...
  18. python手机价格预测论文_基于Python的微博发表意向预测研究
  19. 英特尔超级计算机显卡,美国公布首台百亿亿次超级计算机!用上Intel Xe独立显卡...
  20. 别在那抱怨高考怎么不考DOTA呢!!高考就是考DOTA你也不行!

热门文章

  1. cesium-04 primitives.update
  2. 蠕虫mysql_一个MS SQL蠕虫代码_MySQL
  3. 补写出下列名篇名句中的空缺部分
  4. python 打印菱形代码
  5. SAP中各种记账凭证的冲销
  6. excel求和为什么是0_为什么不能求和?Excel常见求和问题解答
  7. 【深入Java虚拟机】之八:Java垃圾收集机制(转)
  8. 全产业链内循环?碧桂园真正的“护城河”!
  9. 如何写每周工作报告(How to Write a Weekly Report)
  10. 以太网学习之二 物理介质(10Base、100Base-T、100Base-TX等)