我在 wpf 应用程序中遇到了一个问题,其中渲染线程停止渲染,但 UI 线程和帮助线程仍在发送消息。
这似乎与演示字体缓存损坏有关,但这似乎不太可能,因为应用程序在重新启动时恢复良好。
渲染线程偶尔会挂起,阻止绘图更新,但 UI 线程仍在泵送消息。
我们已经看到了一个类似的问题(类似于 here),它在对文本块应用缩放变换时发生,该问题通过删除字体缓存来解决,但是这个特定问题不能可靠地重复。
诊断此问题根本原因的最佳方法是什么?
我在 connect 上打开了微软的错误,但除非其他人投票通过,否则不会考虑。
最佳答案
卡住是由托管的 Activex 控件呈现视频引起的。
控件使用 directshow 的方式存在竞争条件,导致 directx 挂起。
我们通过使用 procdump 进行进程转储发现了这个问题。然后在 windows 中打开转储文件 debugger .
在 net 上四处寻找检查 native 调用堆栈显示了一个问题,即临界区指针的高位字节为零,这意味着其中一个线程正在等待一个永远不会发出信号的不存在的临界区。
这使我们能够通过运行启动和停止视频的代码来创建可重复的挂起。我们移除了控件,挂起停止了。
关于WPF 渲染线程挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6132896/