Java教程

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

本文主要是介绍多线程和异步编程的那些事 (七),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

这篇关于多线程和异步编程的那些事 (七)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!