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

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值