【发布时间】: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