带有 MahApps 的 C# WPF 应用无法在 Windows 2008 中显示

C# WPF app with MahApps failing to display in Windows 2008

所以这很奇怪。

我使用 MahApps 为 GUI 创建了一个 WPF 应用程序。到目前为止,我的测试表明该应用程序在几台不同的机器上运行良好。当然在客户端机器上就不是这样了

客户端使用终端服务和Windows Server 2008R2。多个用户可以随时登录到他们自己的服务器版本。该应用程序启动一两次都很好,但大约一天后,它就不再打开了。

该应用程序未显示在任务管理器的“应用程序”选项卡中,但可以在任务管理器的“进程”选项卡中看到其进程运行。

老实说,我完全被难住了。我查看了事件管理器日志,但找不到任何表明存在问题的信息。 (当然我可能漏掉了什么)。我看到另一个建议禁用硬件加速的 SO 问题,但我不知道这是否有帮助。

如有任何想法,我们将不胜感激。

编辑: 我想我可能会提到唯一有帮助的是我们重新启动客户端机器。

编辑: 我想我已经将问题与与 Twain 的集成隔离开来(可能应该将其作为另一个可能的因素提到)。我认为 Twain 库(非托管代码)以某种方式停止而不发回错误。禁用它有 "fixed" 问题。

这在某种程度上与 Twain 和多会话设置有关。我几乎可以肯定。

首先可以在Windows资源监视器中分析等待链,查看进程是否有正在等待的资源。 (您可以找到有关等待链的更多信息 here or here。)

如果您在那里没有找到任何可行的可疑对象,您可以创建挂起进程的内存转储并分析调用堆栈。如果你不知道如何创建一个,你可以阅读它 here。如果您想使用 Windows 任务管理器并且您的 OS 是 64 位的,那么请注意您需要使用与应用程序相同的任务管理器位数。

即:如果您的应用程序是 64 位的,则必须使用 C:\Windows\System32\taskmgr.exe,如果是 32 位的,则必须使用 C:\Windows\SysWOW64\taskmgr.exe。如果你忘记了这个重要的步骤,你只会得到一个充满乱码的无法使用的转储。

获得内存转储后,您可以将其加载到 WinDbg(使用与应用程序相同的位数)或 Visual Studio(最好使用 2015 或更高版本)并分析所有 运行 个线程。

您可以下载 WinDbg here and read about the necessary WinDbg configuration here. For the list of all threads you need to use this SOS 命令。

如果您在将内存转储加载到 Visual Studio 中需要帮助,您可以找到更多信息 here

查看调用堆栈后,您肯定会找到答案,什么在等待什么资源,从而阻止了应用程序的关闭或启动。它可以是典型的死锁,也可以是文件的 writing/reading 等外部资源,也可以是其他没有超时的等待,例如访问数据库或目前无法访问的 URL。当然,它也可以只是一个无限循环——如果它不消耗太多 CPU 那么也许在两者之间有某种 DoEvents

最后但同样重要的是:如果您真的对应用程序挂起时可以分析的内容感兴趣,您可以阅读由绝对了不起的 Mark Russinovich here.[=18= 完成的示例分析]