关于跨线程调用控件。最后面注释掉的三项和之前一项有什么区别? 为什么最后一项会报错?
private delegate void SetControl(bool set);
private void button3_Click(object sender, EventArgs e)
{
button3.Enabled = false;
thread = new Thread(InvokeControl);
thread.IsBackground = true;
thread.Start();
}
private void button4_Click(object sender, EventArgs e){ }
private void Setbutton(bool set)
{
button4.Enabled = set;
}
private void InvokeControl()
{
if (this.listBox1.InvokeRequired)//等待异步
{
SetControl fc = new SetControl(Setbutton);
button4.Invoke(fc, false);
//BeginInvoke(fc, false);
//this.Invoke(fc, false);
//fc.Invoke(false);
}
}
------最佳解决方案--------------------
首先你要明白Invoke是干什么的。
用this.Invoke就可以的。
fc.Invoke报跨线程错误,因为创建fc的线程和Setbutton中button4不在一个线程。
Invoke就是是用创建该对象的线程去执行一些代码。
this.Invoke,就是用创建this的线程去调用Setbutton,显然this和button4都是主线程创建的,所以不报错。
fc.Invoke是用创建fc的线程去调用Setbutton,而fc也是在new Thread里面创建的,显然fc和button4不在同一个线程中,所以要报错。
------其他解决方案--------------------BeginInvoke
其实就是
this.BeginInvoke
表示异步调用,不等调用结束,继续执行后面的代码
this.Invoke是同步调用,调用完成后才执行后面的代码
fc.Invoke(false);要看SetControl是什么了。
------其他解决方案--------------------上面就是示例程序的全部代码了,你可以编译下,调用fc.Invoke(false);会报试图跨线程操作控件的错误。