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

标签 c# wpf windows windows-server-2008-r2

所以这很奇怪。

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

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

应用程序没有出现在任务管理器的应用程序选项卡中,但在任务管理器的进程选项卡中可以看到其进程正在运行。

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

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

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

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

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

最佳答案

首先可以在Windows Resource Monitor中分析wait chain,查看进程是否有正在等待的资源。 (您可以找到有关等待链 herehere 的更多信息。)

如果您在那里没有找到任何可行的可疑对象,您可以创建挂起进程的内存转储并分析调用堆栈。如果您不知道如何创建,可以阅读相关内容 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/

相关文章:

c# - 是否有一种 LINQ 方式可以将相同的字符追加 n 次到一个字符串?

wpf - 从 StoryBoard 访问 Grid.Columnspan

windows - .pl 文件在记事本中打开

c++ - 创建虚拟分区

c# - 在 .NET Web 应用程序中填充缓存时的线程管理

c# - 如何使用 C#/.NET 的反射在程序集中实例化类?

C# EPPlus 数据栏条件格式与纯色填充

.net - 在没有服务定位器的情况下注入(inject) ViewModel

c# - (C#) Windows 服务中的 ReportViewer

windows - 从 Windows 共享 checkout