ios 如何把一个控件放到页面最上层_C#跨线程访问控件需要注意的问题

C#跨线程访问控件,我们一般 new 一个线程,多线程来操作。今天本以为是这样操作的,可还是卡死了。记录一下碰到的这些疑难杂症。

一、怀疑多界面问题

其实,与嵌套多少个控件没关系。

14fbd09cb953b8b32b2d0b96a6f0bdfa.gif
▲ 我是在一个主窗体放了一个panel,然后,在panel里面加载menu1,menu1通过按钮加载menu2;再在menu2里面new一个线程,跨线程访问textbox。可这样还是被卡死了。

怀疑是在主窗体嵌入的两个menu,在menu里面这样操作不行。后面这种情况被我排除了。因为,我把代码复制到主页面,相同功能还是卡死。所以,还是代码有问题。

二、聚焦代码问题

问题其实是,this.textBox1.Invoke(/*调用代码*/)调用代码不能太耗时,与控件本身操作无关的代码,不然就卡死。因为 Invoke 在住线程?

开始我是这样写的:

int a = 0;
thread = new Thread(() =>
{
    if (this.textBox1.InvokeRequired) {
        this.textBox1.Invoke(new Action(() => {
            while (true) {
                this.textBox1.Text = a++.ToString(); 
                Thread.Sleep(1000);
            }
        }));
    }
});

thread.IsBackground = true;
thread.Start();

把循环放到控件Invoke外面去

int a = 0;
thread = new Thread(() =>
{
    if (this.textBox1.InvokeRequired) {
        while (true) {
            this.textBox1.Invoke(new Action(() => {
                this.textBox1.Text = a++.ToString();  
                Thread.Sleep(1000);
            }));
        }
    }
});

thread.IsBackground = true;
thread.Start();

上面这样还是不行的,Thread.Sleep(1000);耗时,且与跨线程访问的控件无关。经测试即使换成耗时的循环for(int i = 0; i < 1000; i++) for(int j = 0; j < 100000; j++);,这样照样会卡死。

Thread.Sleep(1000);Invoke外面去

这样能够工作的,不卡。

int a = 0;
thread = new Thread(() =>
{
    if (this.textBox1.InvokeRequired) {
        while (true) {
            this.textBox1.Invoke(new Action(() => {
                this.textBox1.Text = a++.ToString();
            }));
            Thread.Sleep(1000);
        }
    }
});

thread.IsBackground = true;
thread.Start();

效果如下:

669a91a72e65973d817cd139713e496d.gif
▲ 主页面的textbox计时显示和两层加载的menu中的textbox的计时显示也是没问题的,窗体不冻结卡死。

其实本质上为什么会这样,我是没有明确搞明白的,都是自己去理解,不确定是不是自己理解的这样。也不想花太多的时间去深究了,能实现效果就好。如何学会把时间花在最关键的地方?这是一门学问,越早明白越受益。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值