在下程序的时候,经常会碰到这样一种情况;

定义的变量会影响多个控件的数值,当变量有变化的时候,需要更新多个控件,这多个控件可能会在不同的界面中,管理起来非常麻烦,这个时候就要用到消息订阅,下面是详细的实现过程;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace 测试程序3
{
    public partial class Form1 : Form
    {
        //声明一个静态变量,可以在其他类中直接调用
        public static Form1 form1;
        public Form1()
        {
            InitializeComponent();
            form1 = this;//初始化的时候,给静态变量赋值
        }

private void tabPage1_Click(object sender, EventArgs e)
        {

}

private void Form1_Load(object sender, EventArgs e)
        {
            string str = "有一家三口,妈妈负责做饭,爸爸和孩子负责吃。。。将这三个人,想象成三个类。 妈妈有一个方法,叫做“做饭”。有一个事件,叫做“开饭”。做完饭后,调用开饭事件,发布开饭消息。爸爸和孩子分别有一个方法,叫做“吃饭”。    将爸爸和孩子的“吃饭”方法,注册到妈妈的“开饭”事件。也就是,订阅妈妈的开饭消息。让妈妈做完饭开饭时,发布吃饭消息时,告诉爸爸和孩子一声。";
            str += "\r\n请单击妈妈做饭的按钮";
            richTextBox1.AppendText(str);
        }
        /// <summary>
        /// 妈妈做饭按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //实例化对象
            Mom mom = new Mom();
            Dad dad = new Dad();
            Child child = new Child();

//将爸爸和孩子的Eat方法注册到妈妈的Eat事件
            //订阅妈妈开饭的消息
            mom.Eat += dad.Eat;
            mom.Eat += child.Eat;

//又有需要在控件中显示多个数据并且有延时,需要使用线程来实现
            //否则界面会假死
            Thread thread = new Thread(mom.Cook);
            thread.IsBackground = true;
            thread.Start();
            //调用妈妈的Cook事件 
            //mom.Cook();
            
        }
        //由于需要在线程中对界面进行操作,需要使用委托。
        public delegate void UpdateString(object NewData);
        public void UpdateRecevie(object NewData)
        {
            if (this.InvokeRequired)//等待异步
            {
                UpdateString _myInvoke = new UpdateString(UpdateRecevie);
                this.Invoke(_myInvoke, new object[] { NewData });
            }
            else
            {
                richTextBox1.AppendText(NewData.ToString());
                richTextBox1.SelectionStart = richTextBox1.Text.Length - 1;
                richTextBox1.ScrollToCaret();
            }
        }

}
    public class Mom
    {        
        //定义Eat事件,用于发布吃饭消息
     
        public event EventHandler<EventArgs> Eat;
      
        public void Cook()
        {
            for(int i=10;i>0;i--)
            {
                Thread.Sleep(1000);
                string tmp = string.Format("\r\n 饭就快做好了。。请等待{0}",i);
                Form1.form1.UpdateRecevie(tmp);
            }
            //调用委托函数
            Form1.form1.UpdateRecevie("\r\n妈妈 : 饭好了");
            
            //饭好了,发布吃饭消息
            Eat(this, new EventArgs());
            
        }
    }

public class Dad
    {
        public void Eat(object sender, EventArgs e)
        {
            //爸爸去吃饭
            Form1.form1.UpdateRecevie("\r\n爸爸 : 吃饭了。");
        }
    }

public class Child
    {
        public void Eat(object sender, EventArgs e)
        {
            //熊孩子LOL呢,打完再吃
            Form1.form1.UpdateRecevie("\r\n孩子 : 打完这局再吃。");
        }
    }
}

c# 使用线程方式实现消息订阅相关推荐

  1. 和push的区别_RocketMQ的消息订阅push和pull的区别

    RocketMQ消息订阅有两种模式: 一种是Push模式,即MQServer主动向消费端推送: 另外一种是Pull模式,即消费端在需要时,主动到MQServer拉取. 但在具体实现时,Push和Pul ...

  2. Web技术(七):如何使用并实现MQTT 消息订阅-发布模型?

    文章目录 一.什么是发布-订阅消息模型? 二.订阅-发布消息模型有哪些应用? 2.1 应用于IP 物联网络中的消息传递 2.2 应用于操作系统进程间的消息传递 2.3 应用于MESH 自组网中的消息传 ...

  3. 嵌入式消息订阅发布模式软件框架

    文章目录 一.总体框架 二.基于RT-Thread的SoftBus 2.1 SoftBus的由来 2.2 消息订阅者模式 2.3 静态订阅关系与动态订阅关系 2.4 C/S模式 2.5 消息订阅者模式 ...

  4. 深入biztalk消息以及消息订阅发布路由机制(二)-消息订阅【转】

    一.消息订阅 订阅消息的主体叫订阅服务器,订阅服务器是可以订阅并消费消息的服务,可以作为订阅服务器的服务类型目前有四类,在BizTalkMgmtDb管理数据库中的adm_ServiceClass的Na ...

  5. Redis中使用Java代码的方式实现发布订阅流程

    场景 Redis中的发布与订阅的概念与以命令行的方式实现发布订阅举例: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/105042 ...

  6. Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)

    前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于SignalR Core的文章了. 先介绍一下SignalR吧,如下: ASP.NET S ...

  7. RabbitMQ消息订阅与轮询

    使用向队列注册消费者,当RabbitMQ服务端的队列接收到消息后推送给客户端,这种方式为消息订阅模式.  RabbitMQ客户端也可通过主动查询的方式,从服务端获取消息.使用主动查询的消费者示例如下. ...

  8. 二十四 Redis消息订阅事务持久化

    Redis数据类型: Redis控制5种数据类型:String,list,hash,set,sorted-set 添加数据,删除数据,获取数据,查看有多少个元素,判断元素是否存在 key通用操作 JR ...

  9. mysql消息订阅与发布_消息发布与订阅

    代码示例 消息发布者 (即publish client) package message.kvstore.aliyun.com; import redis.clients.jedis.Jedis; p ...

最新文章

  1. 快来参加学习.NET 挑战赛
  2. .rdlc 文件设置方向_在Word里面怎么设置把字竖着打出来?
  3. matlab1分钟数据转5分钟,把股票的5分钟k线数据转换成matlab的day文件
  4. Hibernate 系列 02 - Hibernate介绍及其环境搭建
  5. 云计算:技术疲劳玩概念 伪云项目横行于世
  6. js练习8(幻灯片切换效果)
  7. 万达9.3亿美元并购北欧最大院线 全球市场份额逼近20%
  8. linux之sed用法-转
  9. 基于阈值和深度学习的玉米常见锈病严重程度自动模糊逻辑预测(工具+综述+玉米锈病严重程度数据集)
  10. 使用wget从网上下载ubuntu源到互联网硬盘,拿到内部用
  11. Bitbucket 触发内网 Jenkins Build
  12. 全球资产管理平台提供商:Charles River Development
  13. BIG5编码, GB编码(GB2312, GBK, ...), Unicode编码, UTF8, WideChar, MultiByte, Char 说明与区别
  14. MATLAB交通标志识别系统
  15. 微信小程序-005-投票功能-设置投票
  16. Art of Problem Solving: Proof without Words
  17. (三)Detecting Spacecraft Anomalies Using LSTMs and Nonparametric Dynamic Thresholding
  18. 数据挖掘➡谈谈为什么学?
  19. 【云原生|中间件】我们为什么要使用DCM?
  20. 面试通知短信模板大全

热门文章

  1. 银联配置 linux 路径,深圳银联POS支付系统安装手册(LinuxMySQL).doc
  2. python换零钱有多少种方案_Python3算法实例 1.2:动态规划 之 换零钱
  3. java 协程 实现 Akka
  4. MySQL绿色版的安装
  5. thinkJava@第五章@隐藏实施过程
  6. Starting HAL daemon:[FAILED]
  7. Oracle DSI(Data Server Internals) 下载说明
  8. 每日百万订单,这样的技术方案更靠谱
  9. 再见,Kafka!再见,RocketMQ!
  10. 破4!《我想进大厂》之Java基础夺命连环16问