一般我们在多线程中,处理UI的一些界面更新;
得使用到Invoke;
但CheckForIllegalCrossThreadCalls=false;的方法一定不要用,不明白的话,大家可以上MSDN查这个参数的意思;
不过从英文词上可以理解为:
Check For Illegal Cross Thread Calls
检测非法跨线程调用
但该参数的设置为false,当然会有很多的隐患:(想想:一个国家,有很多非法分子一直在犯罪,不去管理的话:抢劫、杀人、发白,强OOXX,等)
有片相关该参数的一些说明的文章,与Invoke相比的:http://tech.ddvip.com/2008-12/1229326955100098.html
好吧,先不多说其它不相关的东西:
本人在多线程下,使用Invoke方法去调用:Form.Show()的方法;
发现,被调用的窗口内容会白屏、并卡死现象;
后来查了一些相关的资料:其中也有一位网友与我遇到一样的问题:
http://www.csharpwin.com/csharpspace/10650r8574.shtml
为了避开因多线程来new From()创建,再show的话,线程内容完了会自己回收相关线程资源
(所以一般很多初学者,不知道,在一个线程(非主线)里创了一个窗口,然后再show,发现,创建闪了一下就消失的问题)
所以我在程序最初,就在主线程里把这个全局都会用到,显示、或是隐藏操作的窗体对象,先new 出来,再将其显示.Show();
注意,关键就在这.Show()的地方,在哪个线程Show()出来的,本人,对WIN 32 API也不太熟悉,不过据目前测试,猜测:第一次Show()时,会决定他的创建线程对象是谁;
相关代码如下:
//全局对象声明
private static SvrQueryForm sqf;
//在主线程中初始化地方
sqf = new SvrQueryForm();
sqf.ShowInTaskbar = false;
double srcOpacity = sqf.Opacity;
sqf.Opacity = 0;
sqf.Show();
sqf.Hide();
sqf.ShowInTaskbar = true;
sqf.Opacity = srcOpacity;
这样之后,在任意一个非主线程里调用Invoke处理Show()就不会出现,白屏、卡死的现象了;