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塊中的代碼。
個人的簡單理解,如有誤敬請指出。