zoukankan      html  css  js  c++  java
  • 控件的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块中的代码。

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

  • 相关阅读:
    mybatis判断字符串是否相等采坑记
    acm时加快cin和cout
    算法竞赛中的无穷大和无穷小
    Electron 安装、运行和项目搭建
    在线更新ubuntu 服务器补丁
    Cannot find module 'webpack/lib/RequestShortener'
    npm install --registry=https://registry.npm.taobao.org
    next InitializeSecurityContext failed
    npm安装typescript
    xmall
  • 原文地址:https://www.cnblogs.com/long612-/p/13534699.html
Copyright © 2011-2022 走看看