控件的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塊中的代碼。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM