【问题标题】:C# application keeps freezing on remoteC# 应用程序一直在远程冻结
【发布时间】:2011-02-24 10:17:36
【问题描述】:

我正在开发一个在服务器上运行的 C# 应用程序(.Net 3.5,Win Forms),用户可以使用远程桌面进行访问。应用程序在远程机器上看似随机的情况下一直冻结(即所有 GUI 组件变成白色,任务管理器报告应用程序没有响应),但在本地运行时不会(我不是完全确定,但未能在我的机器上重现冻结)。

有没有人在他的远程访问应用程序中遇到过这种行为?你会建议什么调试策略?在开发可通过远程桌面访问的 Win Forms 应用程序时,我是否需要考虑一些特别的事情?

编辑:关于应用程序和冻结的一些说明:应用程序不会从冻结中恢复。此外,在用户交互期间不会发生(或尚未发生)冻结,而是在登录到远程计算机之间。该应用程序监控 CFD 求解器,因此即使没有人使用它,它也能正常工作。

更新:

我们确实实现了详细的日志记录,将每个函数调用写入一个带有时间戳的文件。不幸的是,结果不是很确定。 IE。记录的最后一个函数调用总是正确返回。此外,即使应用程序出现冻结(GUI 完全白色等),仍有一些后台计时器仍在运行。在some trouble 之后,我们设法查看了 WinDBG 中的故障转储。在系统线程上,我们发现了对 OnUserPreferenceChanged() 的调用,并进一步调用了 Invoke.WaitOne()。我们还不能确定,但​​这似乎是thesearticles 中描述的问题。作为快速修复,我为提到的事件安装了一个虚拟处理程序。我会报告结果如何。

更新 2:

事实证明,登录到远程计算机会触发多个 OnUserPreferenceChanged() 事件。所以这确实是可疑的问题。但事实证明,修复并不那么容易。我原以为每次后台线程尝试修改在系统线程上创建的控件时都会引发 IllegalCrossReferenceException。情况似乎并非如此。我命名了我的系统线程,并且在每次访问控件之前,我都断言当前线程名称是系统线程的名称。在不同的地方,这个断言都失败了(例如,在来自计时器的回调中),但没有抛出异常。在这些地方使用适当的委派后,冻结停止了。该应用程序现在连续运行了几个星期,我的用户再次感到高兴;)

【问题讨论】:

标签: c# .net-3.5 remote-desktop


【解决方案1】:

我认为冻结与远程桌面无关。添加日志记录是一个很好的建议。我有一些建议,但在不了解您的应用程序的详细信息的情况下,我无法说得太具体。

我最简单的建议是在冻结发生时检查任务管理器中的内存使用情况和 CPU 使用情况。

如果添加详细日志记录不是一个选项,请添加足够的日志记录以了解应用程序何时冻结。这可能只是应用程序中的一个线程,它每分钟将时间戳写入文件一次。然后你可以看看它在冻结时是否有任何模式,例如在用户注销之后,或者当你正在监视的某些数据发生变化时,或者在每天的某个时间,或者在在线一段时间之后时间。

最后一个非常老套的解决方案是编写一个小型看门狗应用程序。此应用程序的唯一工作是定期检查主应用程序以确保它仍然响应。根据您的应用程序的功能,您如何大幅降低这一点。如果看门狗发现主应用程序已停止,它可以终止主应用程序的线程并从二进制文件重新启动它。

【讨论】:

  • WinDBG 是一个很棒的工具。我应该把它放在我的答案中!感谢您的支持,这是我的第一个。 :)
  • 为什么标记为正确:“事实证明,登录到远程计算机会触发几个 OnUserPreferenceChanged() 事件。所以这确实是可疑的问题。”意味着这个答案的第一行使得错了吗? “我认为冻结与远程桌面无关。”
【解决方案2】:

如果您使用应用程序流式传输,您的服务器可能会减慢连接速度或等待丢弃的数据包,如果您的物理设备使用 Windows 远程桌面,则可能会产生这种情况,那么您的问题就是不应该通过远程桌面运行密集型应用程序

【讨论】:

    【解决方案3】:

    AFAIK,没有区别。另外,我从来没有遇到过这样的问题。我建议您尝试以下方法:

    • 使用扩展日志记录扩展您的应用程序,以查看当您的应用程序冻结时用户在做什么
    • 检查用于连接远程计算机的网络连接
    • 检查冻结期间的 CPU 使用率

    如果冻结时间过长,请尝试执行以下操作:

    • 通过远程桌面重现冻结。
    • 到刚才重现冻结的机器上直接登录看看,应用是否还被冻结

    【讨论】:

    • 感谢您迄今为止的意见。添加扩展日志记录是一项劳动密集型工作(~30'000 loc),但如果没有其他选择,我们将求助于它。不幸的是,在用户交互过程中,Bug 没有发生(或尚未发生),用户似乎只是在登录远程服务器时遇到应用程序冻结(该应用程序主要用于监视一些事情)。应用程序不会从冻结中恢复。不过下次出现卡顿我肯定会直接登录机器,好点!
    • 当然,添加日志记录总是一件很麻烦的事,如果您以后需要这样做的话。也许您可以以某种方式将其缩小到代码的某个部分。
    • 似乎没有理由冻结与远程桌面有任何关系,因为冻结发生时,没有人连接......
    【解决方案4】:

    如果是windows 10 version 1903 plus 版本。那么可能是windows的问题。请尝试以下设置: 阅读了各种博客并得出结论,GPO 必须强制使用 XDDM 而不是 WDDM。在 Windows 10 版本 1903 中观察到该问题。目前在机器 NDT-61 上测试了解决方法。它工作正常。请针对各自的环境进行相同的练习,如果遇到问题,请告诉我。

    要遵循的步骤:

    1. 打开组策略编辑器
    2. 探索管理模板
    3. 探索 Windows 组件
    4. 探索远程桌面服务
    5. 点击远程会话环境
    6. 在远程会话环境下禁用使用 WDDM 图形显示驱动器进行远程桌面连接

    注意:

    此策略设置允许您为远程桌面连接启用 WDDM 图形显示驱动程序。 如果启用或未配置此策略设置,远程桌面连接将使用 WDDM 图形显示驱动程序。 如果禁用此策略设置,远程桌面连接将不会使用 WDDM 图形显示驱动程序。在这种情况下,远程桌面连接将使用 XDDM 图形显示驱动程序。

    要使此更改生效,您必须重新启动 Windows

    观察:

    政策设置仅适用于 Windows 10 版本 1903 及以上版本 [最好是从问题开始时开始]。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多