1. 程式人生 > 實用技巧 >控制元件的InvokeRequired方法

控制元件的InvokeRequired方法

C#為控制元件單獨開闢了一個執行緒,當另外一個執行緒的方法需要修改控制元件或者呼叫控制元件的方法時,需要通過控制元件的InvokeRequired方法來進行。

比如,當另一個執行緒想呼叫控制元件的方法時:

//定義委託
private delegate void SendCallBack(List<byte[]> bufferList,bool feedback);

//Send方法屬於某個視窗
private void Send(List<byte[]> bufferList,bool feedback) {
            if (this.InvokeRequired) {                          //跨執行緒呼叫時的執行邏輯
                
try { SendCallBack cb = new SendCallBack(Send); this.Invoke(cb,bufferList,feedback); } catch(Exception ex) { MessageBox.Show(ex.Message); } } else {
//不是跨執行緒呼叫此方法時的執行邏輯 }

}
private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e) {
    Send(bufferlist,true);
}  

控制元件的InvokeRequired屬性:bool值,為true時表示呼叫Send方法的是另一個執行緒,此時需要將Send方法傳送給一個委託讓委託所在的執行緒來代替執行Send方法;為false時表示Send的呼叫者沒有跨執行緒呼叫Send方法,此時直接執行else中的程式碼即可。

串列埠的DataReceived事件和Send方法所屬的視窗不在同一個執行緒,因此在serialPort1_DataReceived事件中呼叫Send方法時就會執行Send方法中if塊中的程式碼。

個人的簡單理解,如有誤敬請指出。