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

Mat*_*ias 9 c# remote-desktop .net-3.5

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

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

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

更新:

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

更新2:

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

Ton*_*ony 1

我认为冻结与远程桌面没有任何关系。添加日志记录是一个很好的建议。我有一些建议,但由于不了解您申请的详细信息,我无法提供太具体的建议。

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

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

最后一个非常hacky的解决方案是编写一个小型看门狗应用程序。该应用程序的唯一工作是定期检查主应用程序以确保它仍然具有响应能力。根据您的应用程序的用途,您如何处理这件事有很大不同。如果看门狗发现主应用程序已停止,它可以终止主应用程序的线程并从二进制文件重新启动它。