日期:2014-05-17  浏览次数:20766 次

关于跨线程调用控件。最后面注释掉的三项和之前一项有什么区别? 为什么最后一项会报错?
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);       
     }           
 }
------最佳解决方案--------------------
引用:
上面就是示例程序的全部代码了,你可以编译下,调用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);会报试图跨线程操作控件的错误。