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

带参数的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语句。

上一篇:不同发行版 DotNet GC(垃圾回收器)类型如何配置?


下一篇:转载 CoreCLR源码探索(七) JIT的工作原理(入门篇)