您当前的位置: 首页 >  c#

Jave.Lin

暂无认证

  • 3浏览

    0关注

    704博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C# Form.Show()方法 的一些线程内部特性

Jave.Lin 发布时间:2012-11-19 15:04:16 ,浏览量:3

一般我们在多线程中,处理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()就不会出现,白屏、卡死的现象了;

关注
打赏
1664331872
查看更多评论
立即登录/注册

微信扫码登录

0.0478s