带参数的Invoke.
//【2】定义委托变量 DelegateShowLabel delegateMethod; public Form1() { InitializeComponent(); //【4】绑定委托 delegateMethod = SetLabel; Task.Run(new Action(()=> { ThreadMethod(); })); } //【3】定义执行方法 public void SetLabel(Label label,string text,Color clr) { try { if (label.InvokeRequired) { // label.Invoke(method, new object[] { label, text, clr }); this.Invoke(delegateMethod, new object[] { label, text, clr }); } else { label.Text = text; label.BackColor = clr; } } catch (Exception ex) { MessageBox.Show("SetLabel"+ex.Message); } } //定义线程方法 public void ThreadMethod() { //【5】使用委托 SetLabel(this.lblTest,"虎年大吉,万事如意!",Color.Green); } } //【1】声明委托类型 public delegate void DelegateShowLabel(Label label,String msg,Color backColor);
if (label.InvokeRequired) { // label.Invoke(method, new object[] { label, text, clr }); this.Invoke(delegateMethod, new object[] { label, text, clr }); } else { label.Text = text; label.BackColor = clr; }
这个方法是重点代码,笔者调试过。如果是跨线程访问控件,InvokeRequired为true,否则else
this.Invoke只是相当于授权执行SetLabel方法。执行完Invoke后InvokeRequired会变为false,这时候会通过delegateMethod再次调用SetLabel方法,就会执行else语句。