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

原文地址:https://www.cnblogs.com/yhood/p/11526666.html

时间: 2024-11-07 20:23:17

c# 通过delegate委托向主线程发送信息的相关文章

Handler消息传递机制(四)子线程接收主线程发送的消息

package com.example.looper; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widg

Android:子线程向UI主线程发送消息

在Android里,UI线程是不允许被阻塞的,因此我们要将耗时的工作放到子线程中去处理. 那么子线程耗时处理后要怎样通知UI线程呢? 我们可以在UI主线程中创建一个handler对象,然后通过重写其handleMessage(Message msg)的方法,该方法会接收到子线程中的handler对象的sendMessage((Message msg)发回来的消息.这样一发一收就完成工作: 而关于主线程向子线程发送消息的内容可以看我的上一篇博客,其中讲到了Looper类及其两个重要方法和实现原理.

有主线程发送message给子线程

通常我们在处理耗时任务时候都会通过新建线程来处理,当任务处理完后通过Handler将结果发送回主线程.比如下面示例: 1 package com.example.testlistener; 2 3 import java.util.Timer; 4 import java.util.TimerTask; 5 6 import android.app.Activity; 7 import android.content.res.Configuration; 8 import android.os.

Android:主线程如何向子线程发送消息

今天讲一下,在Android中主线程如何向子线程中发送消息的问题. 或许回想无非就是创建一个Handler对象,然后一个线程发消息,另一个接收消息嘛-- 原理确实是这样,但是我们平时,是从子线程向主线程发消息,而主线程默认已经帮我们完成了Looper的操作,所以我们只需要简单的"创建一个Handler对象,然后一个线程发消息,另一个接收消息"-- 我们先说一下这个Looper是神马吧. 它就像一个消息队列(MessageQueue)的管家(Looper),一个消息队列只有一个管家,并且

Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主要研究Handler的消息发送. 包含主线程往子线程发送消息,子线程之间互相发送消息. 一.主线程向子线程发送消息. 实现过程比較简单: 主线程发送消息到异步线程.异步线程接收到消息后在再发送一条消息给主线程. 1. 初始化主线程的Handler,用来接收子线程的消息. 2. 启动异步线程.在异步线

Android线程之主线程向子线程发送消息

和大家一起探讨Android线程已经有些日子了,谈的最多的就是如何把子线程中的数据发送给主线程进行处理,进行UI界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发送数据,这个用的地方也是非常的多,例如当我们为了优化用户体验,我们会在不影响用户使用的情况下进行后台数据更新,好了废话不多说,开始我们今天的讨论. public class ThreadActivity extends Activity implements OnClickListener{ pri

Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息

之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码: package cn.lixyz.handlertest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import andr

c#子线程执行完怎么通知主线程(转)

定义一个委托实现回调函数 public delegate void CallBackDelegate(string message); 程序开始的时候 //把回调的方法给委托变量 CallBackDelegate cbd = CallBack; //启动线程 Thread th = new Thread(Fun); th.Start(cbd);//开始线程,代入参数 //线程执行的方法 参数是个委托, 线程中参数需要用object类型. public void Fun(object o) { /

android 主线程和子线程之间的消息传递

从主线程发送消息到子线程(准确地说应该是非UI线程) package com.zhuozhuo;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.util.Log;import android.view.View;import android.view.Vie