zoukankan      html  css  js  c++  java
  • c# 通过delegate委托向主线程发送信息

    c# windows编程,常会用到多线程,在新开的线程中要对主线程的页面数据进行更改时,需要通过delegate进行委托

     public delegate void show(string  info); //定义一个委托,参数为string
     private void add_info_event(string info) //定义一个方法,判断控件是否需要引用才可操作,将该方法与委托进行绑定,并用Invoke调用该委托和传递参数。
     {
        if (this.txb_info.InvokeRequired)
        {
           show d = new show(add_info_event);  //声明一个show委托,并且该委托指向add_info_event方法
           this.Invoke(d, new object[] { info });  //引用该委托,并传递参数
        }
        else
        {
         add_info(info);  //调用真正的代码逻辑
        }
    }

    在子线程代码中,直接调用add_info()属于跨线程操作,无法操控主线程内容,调用add_info_event()即可。

    扩展:如果主form,生成一个子form,子form要对主form的进行通信,更改内容,也可以使用delegate和event相配合。

    子form1:

       public delegate void sendMessage(string message); //定义一个委托,发送消息
    
       public event sendMessage sendTo; //声明一个事件,类型为sendMessage   调用sendTo(string message)向主窗体通信

    主form:

    Form1 form1=new Form1();
    //主窗体的构造方法
    public Form(){
     form1.show(); form1.sendTo
    += new Form1.sendMessage(SendArgs); //将子窗体的sendTo事件类型为sendMessage委托,并将委托与主窗体中的SendArgs方法绑定; } public delegate void getMessage(string message); //定义一个委托,接收消息 private async void SendArgs(string message)
    {
    if (this.DateListView.InvokeRequired)  //判断控件是否需要引用 { getMessage d = new getMessage(SendArgs); //声明一个getMessage委托,该委托指向SendArgs方法。 this.Invoke(d, new object[] { message}); //调用该委托,传递参数 } else { MessageBox.Show(message); }
    }

    子窗体发送消息,一个委托,一个事件sendTo

    主窗体接收消息,一个委托

    两个委托都指向主窗体的SendArgs方法

    子窗体触发事件sendTo,即调用sendMessage委托,执行sendArgs方法,sendArgs方法判断更改控件需要引用来执行,则调用getMessage委托;

  • 相关阅读:
    小程序数据库 用正则查询字符串字段/数组字段
    一键禁用Windows多余?服务
    Switch 10.1.0 无法启动软件请在home菜单中再试一次 解决方法
    算法记录
    LeetCode——面试题 10.01. 合并排序的数组
    LeetCode——98. 验证二叉搜索树
    LeetCode——55. 跳跃游戏
    LeetCode——92. 反转链表 II
    LeetCode——206. 反转链表
    LeetCode——225. 用队列实现栈
  • 原文地址:https://www.cnblogs.com/yhood/p/11526666.html
Copyright © 2011-2022 走看看