我正在开发一个在服务器上运行的C#应用程序(.Net 3.5,Win Forms),并由使用远程桌面的用户访问。应用程序在远程计算机上看似随机的场合一直处于冻结状态(即所有GUI组件都变为白色,任务管理器报告应用程序没有响应),但在本地运行时却没有(我不是完全确定这一点,但未能在我的机器上重现冻结)。
有没有人在远程访问的应用中遇到过这样的行为?你会建议什么样的调试策略?在开发远程桌面访问的Win Forms应用程序时,是否需要考虑一些特殊内容?
编辑:关于应用程序和冻结的一些注意事项:应用程序无法从冻结中恢复。此外,冻结在用户交互期间不会发生(或尚未发生),而是在登录到远程计算机之间。该应用程序监视CFD求解器,因此即使没有人使用它也会执行操作。
更新
我们确实实现了详细的日志记录,将每个函数调用写入带有时间戳的文件。不幸的是,结果并不是很有说服力。即记录的最后一个函数调用始终正确返回。此外,有一些后台计时器仍在运行,即使应用程序出现了冻结(GUI完全白色等)。在some trouble之后,我们设法了解了WinDBG中的故障转储。在系统线程中,我们发现了对OnUserPreferenceChanged()的调用,并进一步调用了Invoke.WaitOne()。我们不能肯定地说,但它似乎是these articles中描述的问题。作为一个快速修复,我为上述事件安装了一个虚拟处理程序。我会报告这是如何解决的。
更新2:
事实证明,登录到远程计算机会触发几个OnUserPreferenceChanged()事件。所以这确实是疑似问题。事实证明,修复并不那么容易。我希望每次后台线程尝试修改在系统线程上创建的控件时都会抛出IllegalCrossReferenceException。似乎并非如此。我命名了我的系统线程,在每次访问控件之前,我断言当前线程名称是系统线程的名称。在各种地方,这个断言失败了(例如在来自计时器的回调中),但没有抛出任何异常。在这些地方使用适当的授权后,冻结停止了。该应用程序现在运行不间断几周,我的用户再次感到高兴;)
答案 0 :(得分:1)
如果您使用的应用程序流式传输您的服务器可能会减慢连接速度或等待丢弃的数据包这可以创建这个,如果你的物理使用Windows远程桌面然后有你的问题密集的应用程序不应该通过远程桌面运行< / p>
答案 1 :(得分:1)
AFAIK,没有区别。另外,我从未遇到过这样的问题。我建议你尝试以下方法:
如果冻结的时间较长,请尝试执行以下操作:
答案 2 :(得分:1)
我不认为冻结与远程桌面有任何关系。添加日志记录是一个很好的建议。我有一些建议,但不知道你申请的细节我不能太具体。
我最简单的建议是在冻结时检查任务管理器中的内存使用情况和CPU使用情况。
如果无法添加详细日志记录,请添加足够的日志记录以了解应用程序冻结的时间。这可能只是应用程序中的一个线程,它每分钟将一个时间戳写入文件。然后,您可以查看冻结时是否存在任何模式,例如用户注销后,或者您正在监控的某些数据发生变化,或者每天某个时间,或者是否在线时间量。
最后一个非常讨厌的解决方案是编写一个小型看门狗应用程序。该应用程序的唯一工作是定期检查主应用程序,以确保它仍然响应。如何根据应用程序的功能大幅降低这种差异。如果监视程序看到主应用程序已停止,它可以终止主应用程序的线程并从二进制文件重新启动它。
答案 3 :(得分:0)
如果是Windows 10版本1903 plus版本。那么可能是Windows问题。请尝试以下设置: 阅读了各种博客,得出的结论是,GPO必须强制使用XDDM而不是WDDM。 Windows 10 1903版中已观察到此问题。当前在计算机NDT-61上测试了解决方法。一切正常。请针对各自的环境进行同样的练习,并让我知道是否遇到问题。
要遵循的步骤:
注意:
此策略设置使您可以为远程桌面连接启用WDDM图形显示驱动程序。 如果启用或未配置此策略设置,则远程桌面连接将使用WDDM图形显示驱动程序。 如果禁用此策略设置,则远程桌面连接将不使用WDDM图形显示驱动程序。在这种情况下,远程桌面连接将使用XDDM图形显示驱动程序。
要使此更改生效,必须重新启动Windows
观察:
策略设置仅在Windows 10 1903版和更高版本中可用(理想情况是自问题开始后)。