WPF渲染线程挂起

| 我在wpf应用程序中遇到问题,其中渲染线程停止渲染,但是UI线程和帮助程序线程仍在泵送消息。 它似乎与演示文稿字体缓存的损坏有关,但是这似乎不太可能,因为该应用程序在重新启动后恢复正常。 渲染线程偶尔会挂起,从而阻止图形更新,但是UI线程仍在泵送消息。 我们已经看到了类似的问题(类似于此处),当将比例转换应用于通过删除字体缓存而解决的文本块时,但是此特定问题无法可靠地重复。 诊断此问题根本原因的最佳方法是什么? 我在connect处与Microsoft一起打开了一个错误,但除非其他人投票赞成,否则不会考虑该错误。     
已邀请:
冻结是由托管的Activex控件渲染视频引起的。 控件使用DirectShow的方式存在竞赛状况,导致Directx挂起。 通过使用procdump进行进程转储,然后在Windows调试器中打开转储文件,我们发现了此问题。 在网上搜寻并检查本机调用堆栈显示了一个问题,其中关键部分指针的高位字节被清零,这意味着其中一个线程正在等待不存在的关键部分,该关键部分永远不会发出信号。 这使我们可以通过执行启动和停止视频的代码来创建可重复的挂起。我们删除了控件,挂起停止了。     
我不知道为什么会这样,但是我以前曾经经历过。在针对框架4.0并在较旧的计算机(XP,Vista)上运行的系统中,更容易观察到它。 我要做的是解决: 删除FontCache3.0.0.0.dat 永久禁用有问题的计算机上的字体缓存服务 解决方案1在一台XP机器上工作。它也可以在Vista机器上工作,但过一会儿问题再次出现。 若要删除FontCache3.0.0.0.dat,必须先停止\“ Windows Presentation Foundation Font Cache 3.0.0.0 \”服务,然后才能删除该文件。在Vista中,它位于c:\\ windows \\ serviceprofiles \\ localservice \\ appdata \\ local下。在XP中,它位于c:\\ windows \\ system32 \\ documents and settings \\ localservice \\ local settings \\ application数据下(我可能拼错了一些文件夹) 我还发现,完全禁用系统(解决方案2)不会影响.net应用程序的性能。     
找到问题根源的唯一方法是从线程中不断进行日志记录,直到找到挂起的原因为止。我可以建议执行日志记录的许多方法,但这取决于渲染线程中代码的复杂程度。没有大量的调试信息(这种现象会引入足够的延迟来暂时解决问题,至少如此),您将无法向下追溯到确实发生的那一次。 如果您可以在VS中重复该操作,则应该使用控制台来记录预期的故障部分,否则,您可能必须将其拉入文本文件或将其发送到系统记录器。 您能否让它重新出现在一个简单的应用程序中,该应用程序仅在应用程序的其余部分进行渲染和相关部分,还是仅在整个程序中发生(只能发生?)?     
您可以使用看门狗服务,该服务在检测到问题时清除缓存。每当您的应用程序运行时,该服务将不得不定期轮询。 我将是第一个承认这不是次优解决方案的人,除非您仅能在一小段时间内开启和关闭该服务,否则很可能会很快耗尽电池电量。     
我认为您必须使用循环轮询,该轮询可以连续检查软件是否正在运行,并在软件挂起时将其重置。     

要回复问题请先登录注册