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);
}
}
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);
}
}
其实就是
this.BeginInvoke
表示异步调用,不等调用结束,继续执行后面的代码
this.Invoke是同步调用,调用完成后才执行后面的代码fc.Invoke(false);要看SetControl是什么了。
用this.Invoke就可以的。
fc.Invoke报跨线程错误,因为创建fc的线程和Setbutton中button4不在一个线程。
Invoke就是是用创建该对象的线程去执行一些代码。this.Invoke,就是用创建this的线程去调用Setbutton,显然this和button4都是主线程创建的,所以不报错。
fc.Invoke是用创建fc的线程去调用Setbutton,而fc也是在new Thread里面创建的,显然fc和button4不在同一个线程中,所以要报错。