WPF渲染线程挂起

WPF渲染线程挂起,wpf,rendering,freeze,Wpf,Rendering,Freeze,我在一个wpf应用程序中遇到了一个问题,其中渲染线程停止渲染,但UI线程和助手线程仍在发送消息 这似乎与演示文稿字体缓存损坏有关,但这似乎不太可能,因为应用程序在重新启动时恢复良好 渲染线程偶尔会挂起,阻止图形更新,但UI线程仍在发送消息 我们已经看到了一个类似的问题(类似于),在对文本块应用缩放变换时发生,该问题通过删除字体缓存得到解决,但是这个特定的问题不能可靠地重复 诊断此问题根本原因的最佳方法是什么? 我在上打开了microsoft的一个bug,但除非其他人投票支持,否则不会考虑该bug

我在一个wpf应用程序中遇到了一个问题,其中渲染线程停止渲染,但UI线程和助手线程仍在发送消息

这似乎与演示文稿字体缓存损坏有关,但这似乎不太可能,因为应用程序在重新启动时恢复良好

渲染线程偶尔会挂起,阻止图形更新,但UI线程仍在发送消息

我们已经看到了一个类似的问题(类似于),在对文本块应用缩放变换时发生,该问题通过删除字体缓存得到解决,但是这个特定的问题不能可靠地重复

诊断此问题根本原因的最佳方法是什么?


我在上打开了microsoft的一个bug,但除非其他人投票支持,否则不会考虑该bug。

您可以使用看门狗服务,当该服务检测到该问题时,该服务将清除缓存。无论应用程序何时运行,服务都必须定期轮询


我将首先承认这是一个次优的解决方案,除非您能够在很短的时间内打开和关闭服务,您可能会很快耗尽电池电量。

我认为您必须使用循环轮询,不断检查软件是否正在运行,并在软件挂起时重置它。

我不知道为什么会发生这种情况,但我以前也经历过这种情况。在以Framework4.0为目标并在较旧的机器(XP、Vista)上运行的系统中更容易观察到它

我要解决的是:

  • 删除FontCache3.0.0.0.dat
  • 永久禁用有问题计算机上的字体缓存服务
  • 解决方案1在一台XP机器上运行。它在Vista机器上也能工作,但过了一会儿问题又出现了

    删除PoTCTCAE3.0.0.0.DAT时,在删除该文件之前,需要停止“Windows演示文稿字体缓存3.0.0.0”服务。在Vista中,它位于c:\windows\serviceprofiles\localservice\appdata\local下。在XP中,它位于c:\windows\system32\documents and settings\localservice\local settings\application data下(我可能错放了一些文件夹)


    我还发现,完全禁用系统(解决方案2)不会影响我的.net应用程序的性能。

    找到问题根本原因的唯一方法是从线程持续记录日志,直到找到挂起的原因。我可以推荐很多方法来进行日志记录,但这取决于渲染线程中的代码有多复杂。如果没有大量的调试信息(这类信息会引入足够的延迟来暂时解决问题),您将无法深入到问题发生的某个时间

    如果您可以在VS中重复它,那么您应该使用一些控制台日志记录预期的故障部分,否则您可能需要将其拉入文本文件,或者将其发送到系统日志记录程序


    你能让它在一个简单的应用程序中再次出现吗?这个应用程序只渲染应用程序其余部分的相关部分,还是只在整个程序中出现(只能出现?)。

    冻结是由一个托管activex控件渲染视频引起的

    控件使用directshow的方式存在竞争条件,导致directx挂起

    我们通过使用获取进程转储,然后在windows中打开转储文件来发现此问题

    在上四处搜索并检查本机调用堆栈显示了一个问题,即关键部分指针的高阶字节被归零,这意味着其中一个线程正在等待一个不存在的、永远无法发出信号的关键部分


    这允许我们通过练习启动和停止视频的代码来创建可重复的挂起。我们删除了控件,挂起停止。

    我看到过类似的问题,我也对这个问题感兴趣!你能提供一个半可重复的例子吗?不幸的是,没有,tofutim。据我们所知,在两台不同的机器上发生过两次。堆栈跟踪也显示正常。我从您的连接链接中找到一个未找到的页面。我的问题不是如何解决此问题。我正在寻找诊断根本原因的帮助。嗨,保罗,问题不是如何解决这个问题。我正在寻找根本原因。@luken plz给我看你的代码我将尝试找出问题所在Hi Padu,我提到问题看起来类似,但在启动时恢复,这似乎排除了字体缓存的问题。框架负责呈现线程-这就是问题所在。有关详细信息,请参阅。从本质上讲,应用程序挂起在microsoft的代码中,而我的代码仍在正常运行。我感兴趣的是,字体缓存服务的问题究竟是导致挂起的原因,还是WPF库的内部存在另一个类似的问题可能导致挂起。如果后者是真的,我将如何测试它(考虑到我不了解wpf或directx的内部结构)。您不能反映它以了解它在做什么吗?你肯定知道reflector或ILSpy,是吗?嗨,我面临着同样的问题,你能详细说明是哪个控件给了你这个错误,以及你是如何使用procdump来监视它的吗?(你使用了哪个命令?)谢谢!有一个视频将向你展示如何使用它。如果您没有编写太多的c/c++,那么理解本机堆栈框架将更加困难。关于如何使用windbg的帮助:和