控件的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块中的代码。

个人的简单理解,如有误敬请指出。

原文地址:https://www.cnblogs.com/long612-/p/13534699.html