在.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";
};
//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);
};
invoke 是执行完了才会往下执行
beginInvoke 不需要等待就往下执行,然后根据线程优先级执行