在.NET中,固定必须主线程才能操作UI界面,如果在非主线程中强行对UI界面赋值,则会报错,跨线程操作UI,是不允许的,需要使用Invoke或BeginInvoke,关于这两个什么时候用,简单来讲,一个是同步,一个是异步,更深底层的话,查阅了相关资料,没看明白,扯到了windows程序消息机制去了,使用windows消息机制实现了封送,我是没看懂这个什么消息机制>_<。

invoke 在拥有此控件的基础窗口句柄的线程上执行指定的委托。

beginInvoke在创建控件的基础句柄所在线程上异步执行指定委托。

 

 

用个简单的例子

//invoke
            this.button1.Click += (sender, e) =>
            {
                this.textBox1.Text += "AA";
                this.Invoke(new Action(() =>
                {
                    this.textBox1.Text += "Invoke";
                }));
                this.textBox1.Text += "BB";
            };

vb.net 启动参数 vb.net invoke_C#

 

//beginInvoke
            this.button2.Click += (sender, e) => {
                this.BeginInvoke(new Action(() =>
                {
                    this.textBox1.Text += "BeginInvoke";
                }));
                this.textBox1.Text += "AA";
                this.textBox1.Text += "BB";
                Thread.Sleep(1000);
            };

vb.net 启动参数 vb.net invoke_C#_02

 

invoke 是执行完了才会往下执行

beginInvoke 不需要等待就往下执行,然后根据线程优先级执行