c# 使用线程方式实现消息订阅
在下程序的时候,经常会碰到这样一种情况;
定义的变量会影响多个控件的数值,当变量有变化的时候,需要更新多个控件,这多个控件可能会在不同的界面中,管理起来非常麻烦,这个时候就要用到消息订阅,下面是详细的实现过程;
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# 使用线程方式实现消息订阅相关推荐
- 和push的区别_RocketMQ的消息订阅push和pull的区别
RocketMQ消息订阅有两种模式: 一种是Push模式,即MQServer主动向消费端推送: 另外一种是Pull模式,即消费端在需要时,主动到MQServer拉取. 但在具体实现时,Push和Pul ...
- Web技术(七):如何使用并实现MQTT 消息订阅-发布模型?
文章目录 一.什么是发布-订阅消息模型? 二.订阅-发布消息模型有哪些应用? 2.1 应用于IP 物联网络中的消息传递 2.2 应用于操作系统进程间的消息传递 2.3 应用于MESH 自组网中的消息传 ...
- 嵌入式消息订阅发布模式软件框架
文章目录 一.总体框架 二.基于RT-Thread的SoftBus 2.1 SoftBus的由来 2.2 消息订阅者模式 2.3 静态订阅关系与动态订阅关系 2.4 C/S模式 2.5 消息订阅者模式 ...
- 深入biztalk消息以及消息订阅发布路由机制(二)-消息订阅【转】
一.消息订阅 订阅消息的主体叫订阅服务器,订阅服务器是可以订阅并消费消息的服务,可以作为订阅服务器的服务类型目前有四类,在BizTalkMgmtDb管理数据库中的adm_ServiceClass的Na ...
- Redis中使用Java代码的方式实现发布订阅流程
场景 Redis中的发布与订阅的概念与以命令行的方式实现发布订阅举例: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/105042 ...
- Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)
前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于SignalR Core的文章了. 先介绍一下SignalR吧,如下: ASP.NET S ...
- RabbitMQ消息订阅与轮询
使用向队列注册消费者,当RabbitMQ服务端的队列接收到消息后推送给客户端,这种方式为消息订阅模式. RabbitMQ客户端也可通过主动查询的方式,从服务端获取消息.使用主动查询的消费者示例如下. ...
- 二十四 Redis消息订阅事务持久化
Redis数据类型: Redis控制5种数据类型:String,list,hash,set,sorted-set 添加数据,删除数据,获取数据,查看有多少个元素,判断元素是否存在 key通用操作 JR ...
- mysql消息订阅与发布_消息发布与订阅
代码示例 消息发布者 (即publish client) package message.kvstore.aliyun.com; import redis.clients.jedis.Jedis; p ...
最新文章
- 快来参加学习.NET 挑战赛
- .rdlc 文件设置方向_在Word里面怎么设置把字竖着打出来?
- matlab1分钟数据转5分钟,把股票的5分钟k线数据转换成matlab的day文件
- Hibernate 系列 02 - Hibernate介绍及其环境搭建
- 云计算:技术疲劳玩概念 伪云项目横行于世
- js练习8(幻灯片切换效果)
- 万达9.3亿美元并购北欧最大院线 全球市场份额逼近20%
- linux之sed用法-转
- 基于阈值和深度学习的玉米常见锈病严重程度自动模糊逻辑预测(工具+综述+玉米锈病严重程度数据集)
- 使用wget从网上下载ubuntu源到互联网硬盘,拿到内部用
- Bitbucket 触发内网 Jenkins Build
- 全球资产管理平台提供商:Charles River Development
- BIG5编码, GB编码(GB2312, GBK, ...), Unicode编码, UTF8, WideChar, MultiByte, Char 说明与区别
- MATLAB交通标志识别系统
- 微信小程序-005-投票功能-设置投票
- Art of Problem Solving: Proof without Words
- (三)Detecting Spacecraft Anomalies Using LSTMs and Nonparametric Dynamic Thresholding
- 数据挖掘➡谈谈为什么学?
- 【云原生|中间件】我们为什么要使用DCM?
- 面试通知短信模板大全
热门文章
- 银联配置 linux 路径,深圳银联POS支付系统安装手册(LinuxMySQL).doc
- python换零钱有多少种方案_Python3算法实例 1.2:动态规划 之 换零钱
- java 协程 实现 Akka
- MySQL绿色版的安装
- thinkJava@第五章@隐藏实施过程
- Starting HAL daemon:[FAILED]
- Oracle DSI(Data Server Internals) 下载说明
- 每日百万订单,这样的技术方案更靠谱
- 再见,Kafka!再见,RocketMQ!
- 破4!《我想进大厂》之Java基础夺命连环16问