TL; DR:
我在.Net 3.5上构build了一个WPF应用程序。 我已经检查了不同操作系统,从Windows XP到Windows 7的各种机器上的应用程序 – 它运行良好,没有错误等。它也适用于我的客户端的几个目标机器,再次包括XP和W7。
然而,在一台机器上,它突然停止工作。 我的客户把机器寄给了我,以便我可以调查。 从驱动器上的文件中,我可以看到有更旧的版本,它们被客户使用了几个月。 我也看到最新的版本尚未安装在这台机器上。 所以,我试着先运行旧版本,看看有什么问题。
TextBox
。 当用户在该文本框中input至less一个字符时,应用程序将冻结。 它甚至在渲染了被掩盖的密码“*” 之前就冻结了。 冻结是完全的,应用程序停止响应(窗口变暗 ,操作系统要closures它),CPU达到100%(实际上是50%,双核系统),唯一的停止方法是通过任务pipe理器。 然后我安装并尝试运行最新版本(v4) – 它的行为就像上面的v3
我也尝试重新安装所有的版本,只是为了确保.EXE / .DLL文件没有损坏 – 没有任何变化(v1 / 2 – 黑色,v3 / 4 – 冻结文本)
技术比特,只是供参考:
该问题不能与用户文件或configuration相关,我试图将它们从有问题的机器复制到健康的机器,并且问题不重复
与密码框相关:代码中绝对没有可能产生死锁或冻结的事件处理程序。 密码文本框没有文本更改的处理程序。 我的代码只有在“确定”button被按下后才能读取文本。 当用户input第一个字符时,应用立即冻结,用户甚至没有机会按“OK”
我专注于TextBox部分,因为它更加细化。
我有应用程序再次冻结,并与ProcessHacker检查线程。
除了典型的线程之外,其中一个线程正在坐着,
wpfgfx_v0300.dll MilGlyphRun SetGeometryAtRenderTime wpfgfx_v0300.dll MilGlyphRun SetGeometryAtRenderTime ... wpfgfx_v0300.dll MilContent DetachFromHWND
这当然是WPF层本身的问题。 从“ DetachFromHWND
” DetachFromHWND
告诉我什么都没有,但MilGlyphRun
肯定是关于文本渲染。 它试图呈现文本时冻结 。 我已经检查了老版本的应用程序的黑屏,但我无法捕捉,因为应用程序没有被冻结,只是黑色。
所以..
没有变化,仍然黑屏,仍然冻结。
所以,重点回到这个问题上。 它没有呈现文字。 听起来很明显,因为当用户在一个文本框中input一个字符时,它会死锁,但它不是显而易见的! 用户被提供了吨吨不同的TextBoxes
直到他终于到了PasswordBox
TextBoxes
。 所有TextBoxes
工作正常,只有这一个失败。 为什么旧版本的应用程序显示黑屏,新版本显示正确的“欢迎”屏幕? 这些问题怎么可能相关?
连接是: Windows Presentation Foundation字体缓存服务。
资料来源:
WPF使用字体缓存服务,作为一个单独的进程运行,以便缓存字体。 每当您的WPF应用程序需要绘制一些文本,它可能会要求缓存服务的字体。 偶尔,字体缓存可能会被破坏 ,然后它可能会随机影响任何WPF应用程序 。
不幸的是,重新启动服务是不够的。 发生这种情况时,您必须删除该服务保留在磁盘上的所有FontCache
文件。 在删除它们之前,您必须停止"Windows Presentation Foundation Font Cache
服务(或者在您的语言中调用的任何内容,例如波兰语的Usługa buforowania czcionek platformy Windows Presentation Foundation
中的Usługa buforowania czcionek platformy Windows Presentation Foundation
)。然后,转到
%systemdrive%\Windows\ServiceProfiles\LocalService\AppData\Local\
%systemdrive%\Windows\ServiceProfiles\LocalService\AppData\Local\
%systemdrive%\Documents and Settings\LocalService\Local Settings\Application Data
并删除所有类似FontCache.dat
文件。 源文章只提到一个文件(FontCache3.0.0.0.dat,但在我的情况下,大约有8个文件具有相似的命名约定)。
在删除它们并重新启动服务之后,我的应用程序的所有版本都再次正常运行。 没有黑色的屏幕,没有冻结的文本框。