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();
这个就是可以使用的正确代码。