多线程和异步编程的那些事 (六)

Invoke:本来想简单整理总结一下,结果发现如果不系统的说明,无法准确说明Invoke的用法。

先从一个简单的案例说起:

从一个错误说起:

这种属于跨线程操作,解决办法就是通过委托方式。

发现使用委托后还是会报错。

如果只调用方法,使用委托就足够了,但是我们操作的是Control,所以要用通过Invoke. 

Invoke方法会顺着控件树向上搜索,直到找到创建控件的那个线程(通常是主线程),然后进入那个线程改变控件的外观,确保不发生线程冲突。

 //【2】创建委托对象
        DelegateSetLabel delegateSetLabel;
        
        public Form1()
        {
            InitializeComponent();
            Task.Run(new Action(()=> { ThreadMethod(); }));
            //【5】绑定委托
            this.delegateSetLabel = ExcuteMethod;
        }
        //多线程方法
        private void ThreadMethod()
        {
            //【5】调用委托
            //  delegateSetLabel();
         //   this.lblTest.Invoke(delegateSetLabel);
            this.Invoke(delegateSetLabel);
        }

        //【3】执行方法
        private void ExcuteMethod()
        {
            this.lblTest.Text = "多线程测试";
           
        }
    }
    //【1】声明委托
    public delegate void DelegateSetLabel();

这个就是可以使用的正确代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值