我正在开发一个在服务器上运行的C#应用程序(.Net 3.5,Win Forms),并由使用远程桌面的用户访问.应用程序在远程计算机上看似随机的场合一直处于冻结状态(即所有GUI组件都变为白色,任务管理器报告应用程序没有响应),但在本地运行时却没有(我不完全确定,但未能在我的机器上重现冻结).
有没有人在他的远程访问的应用程序中遇到过这样的行为?你会建议什么样的调试策略?在开发远程桌面访问的Win Forms应用程序时,是否需要考虑一些特殊问题?
编辑:有关应用程序和冻结的一些注意事项:应用程序无法从冻结中恢复.此外,冻结在用户交互期间不会发生(或尚未发生),而是在登录到远程计算机之间.该应用程序监视CFD求解器,因此即使没有人使用它也会执行操作.
更新:
我们确实实现了详细的日志记录,将每个函数调用写入带有时间戳的文件.不幸的是,结果并不是很有说服力.即记录的最后一个函数调用总是正确返回.此外,有一些后台计时器仍在运行,即使应用程序出现了冻结(GUI完全白色等).经过一些麻烦,我们成功地看看在WinDbg中故障转储.在系统线程中,我们发现了对OnUserPreferenceChanged()的调用,并进一步调用了Invoke.WaitOne().我们不能肯定地说,但这似乎是这些 文章中描述的问题.作为一个快速修复,我为上述事件安装了一个虚拟处理程序.我会报告这是如何工作的.
更新2:
事实证明,登录到远程计算机会触发几个OnUserPreferenceChanged()事件.所以这确实是疑似问题.事实证明,修复并不那么容易.我希望每次后台线程尝试修改在系统线程上创建的控件时都会抛出IllegalCrossReferenceException.似乎并非如此.我命名了我的系统线程,在每次访问控件之前,我断言当前线程名称是系统线程的名称.在各个地方,这个断言失败了(例如,在来自计时器的回调中),但没有抛出任何异常.在这些地方使用适当的授权后,冻结停止了.应用程序运行不间断几周,我的用户再次开心;)
考虑像这样的继承层次结构:
A
/ \
B1 B2
\ /
C
|
D
在C++中实现,如下所示:
class A {
public:
A() {};
virtual ~A() = 0;
double a;
};
A::~A() {};
class B1 : virtual public A {
public:
B1() {}
virtual ~B1() {}
double b1;
};
class B2 : virtual public A {
public:
B2() {}
virtual ~B2() {}
double b2;
};
class C : public B1, public B2 {
public:
C() {}
virtual ~C() {}
double c;
};
class D : public …Run Code Online (Sandbox Code Playgroud)