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

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

  • 相关阅读:
    天天写业务代码,如何成为技术大..niu?
    2021年12月PHP面试题总结
    同事乱用 Redis 卡爆,我真是醉了...
    如何合理的面试审问面试官:
    进制转换
    Is there a difference between table.class tr, th and table .class tr, th?
    ubuntu中安装notepadqq
    VPDN
    OpenAppFilter 自定义特征库
    Tcping详细使用教程
  • 原文地址:https://www.cnblogs.com/long612-/p/13534699.html
Copyright © 2020-2023  润新知