跨线程更新界面(winform下 C#)

本文探讨了.NET框架下跨线程访问控件引发的错误,并提供了两种解决方案:通过设置`CheckForIllegalCrossThreadCalls`和使用`Control.BeginInvoke/Invoke`方法来避免错误Cross-thread operation not valid。解释了`PostMessage`和`SendMessage`的区别,以及在不同场景下如何正确地执行跨线程操作,确保控件更新不被阻塞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.net 不允许跨线程访问控件

会提示 不是由创建线程访问

Cross-thread operation not valid:Control 'textBox1' accessed from a thread other than the thread it was created on .

解决方案:

1、设置Control.CheckForIllegalCrossThreadCalls

        2、在工作线程使用委托

使用Control.BeginInvoke/Invoke 

说明: 

1、实际Control调用 begininvoke/invoke不会创建新线程 实际相当于post/send message

两者区别:

PostMessage只负责将消息放到消息队列中,不确定何时及是否处理
    SendMessage要等到受到消息处理的返回码(DWord类型)后才继续
    PostMessage执行后马上返回
    SendMessage必须等到消息被处理后才会返回。
       2. invoke 执行的委托 实际在由主线程执行函数

对比下面两个方式

#region 跨线程调用方法测试
        delegate void newDelegate();
        public void thMethod() 
        {
            //方案一
            //newDelegate del = new newDelegate(changeUI);
            //this.BeginInvoke(del);
            ///*方案二
            while (true) 
            {
                Thread.Sleep(1000);
                changeUI();
            }
            //*/

        }
        public void changeUI()
        {
            /*//方案一
            while (true)
            {
                Thread.Sleep(1000);
                this.label1.Text = System.DateTime.Now.ToString();
            }*/
            ///*方案二
            if (label1.InvokeRequired)
            {
                newDelegate de = new newDelegate(changeUI);
                this.BeginInvoke(de);
            }
            else
                this.label1.Text = System.DateTime.Now.ToString();

        }

        private void button2_Click(object sender, EventArgs e)
        {
            Thread th = new Thread(thMethod);
            th.IsBackground = true;
            th.Start();
        }
        #endregion


changeUI函数委托在主线执行

方案一 在changeUI中执行了 死循环 会让主线程卡死

方案二 在thMethod中由工作线程执行死循环 不会影响主线程更新控件的工作


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值