C#应用程序在远程时保持冻结

我正在开发一个在服务器上运行的C#应用​​程序(.Net 3.5,Win Forms),并由使用远程桌面的用户访问。 应用程序在远程计算机上看似随机的场合一直处于冻结状态(即所有GUI组件都变为白色,任务管理器报告应用程序没有响应),但在本地运行时却没有(我不完全确定,但未能在我的机器上重现冻结)。

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

编辑:关于应用程序和冻结的一些注意事项:应用程序无法从冻结中恢复。 此外,冻结在用户交互期间不会发生(或尚未发生),而是在登录到远程计算机之间。 该应用程序监视CFD求解器,因此即使没有人使用它也会执行操作。

更新:

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

更新2:

事实certificate,登录到远程计算机会触发几个OnUserPreferenceChanged()事件。 所以这确实是疑似问题。 事实certificate,修复并不那么容易。 我希望每次后台线程尝试修改在系统线程上创建的控件时都会抛出IllegalCrossReferenceException。 似乎并非如此。 我命名了我的系统线程,在每次访问控件之前,我声称当前线程名称是系统线程的名称。 在各个地方,这个断言失败了(例如,在来自定时器的回调中),但没有抛出任何exception。 在这些地方使用适当的授权后,冻结停止了。 该应用程序现在运行不间断几周,我的用户再次感到高兴;)

我不认为冻结与远程桌面有任何关系。 添加日志记录是一个很好的建议。 我有一些建议,但不知道你的应用程序的细节我不能太具体。

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

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

最后一个非常讨厌的解决方案是编写一个小型看门狗应用程序。 该应用程序的唯一工作是定期检查主应用程序,以确保它仍然响应。 你如何根据应用程序的作用大幅降低这种差异。 如果监视程序看到主应用程序已停止,它可以终止主应用程序的线程并从二进制文件重新启动它。

如果您使用应用程序流式传输您的服务器可能会减慢连接或等待丢弃的数据包这可以创建这个如果您的物理使用Windows远程桌面然后有你的问题密集的应用程序不应该运行通过远程桌面

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

  • 使用扩展日志记录扩展您的应用程序,以查看应用程序冻结时用户正在执行的操作
  • 检查用于连接远程计算机的网络连接
  • 在冻结期间检查CPU使用情况

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

  • 通过远程桌面重现冻结。
  • 转到刚刚复制冻结的机器并直接登录,看看应用程序是否仍然冻结