通过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委托;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值