控件的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块中的代码。
个人的简单理解,如有误敬请指出。