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);       
     }           
 }

解决方案 »

  1.   

    BeginInvoke
    其实就是
    this.BeginInvoke
    表示异步调用,不等调用结束,继续执行后面的代码
    this.Invoke是同步调用,调用完成后才执行后面的代码fc.Invoke(false);要看SetControl是什么了。
      

  2.   

    上面就是示例程序的全部代码了,你可以编译下,调用fc.Invoke(false);会报试图跨线程操作控件的错误。
      

  3.   

    首先你要明白Invoke是干什么的。
    用this.Invoke就可以的。
    fc.Invoke报跨线程错误,因为创建fc的线程和Setbutton中button4不在一个线程。
    Invoke就是是用创建该对象的线程去执行一些代码。this.Invoke,就是用创建this的线程去调用Setbutton,显然this和button4都是主线程创建的,所以不报错。
    fc.Invoke是用创建fc的线程去调用Setbutton,而fc也是在new Thread里面创建的,显然fc和button4不在同一个线程中,所以要报错。