所以这很奇怪。
我使用 MahApps 为 GUI 创建了一个 WPF 应用程序。到目前为止,我的测试表明该应用程序在几台不同的机器上运行良好。当然在客户端机器上不是这样。
客户端使用终端服务和 Windows Server 2008R2。多个用户可以随时登录到他们自己的服务器版本。该应用程序可以正常启动一两次,但大约一天后,它就不再打开了。
应用程序没有出现在任务管理器的应用程序选项卡中,但在任务管理器的进程选项卡中可以看到其进程正在运行。
老实说,我完全被难住了。我查看了事件管理器日志,但找不到任何表明存在问题的信息。 (当然我可能漏掉了什么)。我看到另一个建议禁用硬件加速的 SO 问题,但我不知道这是否有帮助。
我们将不胜感激任何想法。
编辑: 我想我可能会提到唯一有帮助的事情是我们重新启动客户端机器。
编辑: 我想我已经将问题与与 Twain 的集成隔离开来(可能应该将其作为另一个可能的因素提到)。我认为 Twain 库(非托管代码)以某种方式停止而不发回错误。禁用它已经“解决”了这个问题。
这在某种程度上与 Twain 和多 session 设置有关。我几乎可以肯定。
最佳答案
首先可以在Windows Resource Monitor中分析wait chain,查看进程是否有正在等待的资源。 (您可以找到有关等待链 here 或 here 的更多信息。)
如果您在那里没有找到任何可行的可疑对象,您可以创建挂起进程的内存转储并分析调用堆栈。如果您不知道如何创建,可以阅读相关内容 here .如果您想使用 Windows 任务管理器并且您的操作系统是 64 位,那么请注意您需要使用与应用程序相同的任务管理器位数。
也就是说:如果您的应用程序是 64 位的,那么您必须使用 C:\Windows\System32\taskmgr.exe
,如果它是 32 位的,您必须使用 C:\Windows\SysWOW64\taskmgr.exe
。如果您忘记了这一重要步骤,您只会得到一个充满乱码的无法使用的转储。
获得内存转储后,您可以将其加载到 WinDbg(使用与应用程序相同的位数)或 Visual Studio(最好使用 2015 或更高版本)并分析所有正在运行的线程的调用堆栈。
您可以下载 WinDbg here并阅读必要的 WinDbg 配置 here .对于所有线程的列表,您需要使用 this SOS 命令。
如果您在将内存转储加载到 Visual Studio 中需要帮助,您可以找到更多信息 here .
查看调用堆栈后,您肯定会找到答案,什么在等待什么资源,从而阻止了应用程序的关闭或启动。它可以是典型的死锁,也可以是外部资源,如写入/读取文件或其他一些没有超时的等待,如访问数据库或当前无法访问的 URL。当然,它也可以只是一个无限循环 - 如果它不消耗太多 CPU,那么可能在两者之间使用某种 DoEvents
。
最后但同样重要的是:如果您真的对应用程序挂起时可以分析的内容感兴趣,您可以阅读由绝对了不起的 Mark Russinovich 完成的示例分析 here .
关于带有 MahApps 的 C# WPF 应用程序无法在 Windows 2008 中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40035968/