C#的publisher与subscriber,事件发布者与订阅者
说明:示例借鉴自这里,但原版很不友好,于是修改了下,一目了然。
直接上代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace _21_event_事件
{
/*
* 事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。
* 应用程序需要在事件发生时响应事件。例如,中断。
* 事件是用于进程间通信。
*
* 包含事件的类用于发布事件。这被称为 发布器(publisher) 类。
* 其他接受该事件的类被称为 订阅器(subscriber) 类。
* 事件使用 发布-订阅(publisher-subscriber) 模型。
*/
class Program
{
static void Main(string[] args)
{
ChangeNumEventPublisher e = new ChangeNumEventPublisher(); Console.WriteLine("订阅之前");
e.SetValue();
e.SetValue(); ChangeNumEventSubscriberA a1 = new ChangeNumEventSubscriberA();
ChangeNumEventSubscriberB b1 = new ChangeNumEventSubscriberB();
ChangeNumEventSubscriberA a2 = new ChangeNumEventSubscriberA();
ChangeNumEventSubscriberB b2 = new ChangeNumEventSubscriberB(); //订阅事件 -- 思考下静态事件与非普通事件的区别
e.ChangeNumEvent += a1.NumManipulationHandler;
e.ChangeNumEvent += a2.NumManipulationHandler;
e.ChangeNumEvent += b1.NumManipulationHandler;
e.ChangeNumEvent += b2.NumManipulationHandler; Console.WriteLine("订阅之后");
e.SetValue();
e.SetValue(); Console.ReadKey();
}
} /// <summary>
/// 包含事件的类,用于发布事件。
/// </summary>
public class ChangeNumEventPublisher
{
private int value; public delegate void NumManipulationHandler(int num); //委托
public event NumManipulationHandler ChangeNumEvent; //事件(我更愿意叫它事件通知的注册中心),注意静态与否的影响 protected virtual void OnNumChanged()
{
if (ChangeNumEvent != null) //判断是否有订阅者
{
Console.WriteLine("有事件发生了,有订阅者,开始通知订阅者");
ChangeNumEvent(value); //有订阅者就发布事件
}
else
{
Console.WriteLine("有事件发生了,但没有订阅者");
} } public void SetValue(int n)
{
if (value != n) //只有值改变的时候才会出发事件
{
value = n;
OnNumChanged();
}
}
} /// <summary>
/// 事件订阅者
/// </summary>
class ChangeNumEventSubscriberA
{
public void NumManipulationHandler(int val)
{
Console.WriteLine("我是ChangeNumEventSubscriberA,是你如约召唤我。val=" + val);
}
}
/// <summary>
/// 事件订阅者
/// </summary>
class ChangeNumEventSubscriberB
{
public void NumManipulationHandler(int val)
{
Console.WriteLine("我是ChangeNumEventSubscriberB,是你如约召唤我。val=" + val);
}
}
}
C#的publisher与subscriber,事件发布者与订阅者的更多相关文章
- Publisher和Subscriber节点
一.Publisher节点 /*"ros/ros.h"里面包含了ROS系统内最常用的一些头文件,包含此文件,便可以使用ROS的核心功能.*/#include "ros/r ...
- ROS学习手记 - 8 编写ROS的Publisher and Subscriber
上一节我们完成了 message & srv 文件的创建和加入编译,这次我们要玩简单的Publisher 和 Subscriber 要玩 Publisher 和 Subscriber, 需要具 ...
- ros之发布者和订阅者协同工作
前面的例子显示了单个发布者/单个订阅者的情况,但是一个节点也可以同时是一个发布者和订阅者,或者拥有多个订阅和发布. 实际上,ROS节点最常做的事情是传递消息,并在消息上进行运算. 例doubler.p ...
- ROS2学习之旅(14)——编写简单的发布者和订阅者(C++)
节点是通过ROS Graph进行通信的可执行进程.在本文中,节点将通过话题以字符串消息的形式相互传递信息.这里使用的例子是一个简单的"talker"和"listener& ...
- javaScript 自定义事件、发布订阅设计模式
现在很多应用都允许用户根据自己的喜好订阅一些自己较为关注的信息,当应用更新了这些信息后将针对不同的订阅类型推送此类信息.例如xx招聘网,当你订阅了互联网IT技术相关分类的招聘信息推送后,当企业在该网站 ...
- Writing a Simple Publisher and Subscriber
用c++实现一个publisher/subscriber publisher #include "ros/ros.h" #include "std_msgs/String ...
- ROS验证publisher和subscriber
在前面的两篇博客中我们用C++在ROS中创建了一个发布者和接收者,并使用catkin_make构建了新的节点,下面就需要验证一下,我们写的是否正确. 首先运行roscore roscore 在使用ca ...
- VB.net Wcf事件广播(订阅、发布)
这篇东西原写在csdn.net上,最近新开通了博客想把零散在各处的都转移到一处. 一.源起 学WCF有一段时间了,可是无论是微软的WebCast还是其他网上的教程,亦或我购买的几本书中,都没有怎么 ...
- 基于EventAggregator的事件发布及订阅
EventAggregator简介 EventAggregator是Prism中专门处理ViewModel与ViewModel之间事件传递的类对象,它提供了针对事件的发布方法和订阅方法,所以可以非常方 ...
随机推荐
- 菜鸟学Java(二十一)——如何更好的进行单元测试——JUnit
测试在软件生命周期中的重要性,不用我多说想必大家也都非常清楚.软件测试有很多分类,从测试的方法上可分为:黑盒测试.白盒测试.静态测试.动态测试等:从软件开发的过程分为:单元测试.集成测试.确认测试.验 ...
- Google MapReduce到底解决什么问题?
很多时候,定义清楚问题比解决问题更难. 什么是MapReduce? 它不是一个产品,而是一种解决问题的思路,它有多个工程实现,Google在论文中也给出了它自己的工程架构实现. MapReduce这个 ...
- angular学习笔记(三十一)-$location(2)
之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍 ...
- SQL Server 2008 R2:error 26 开启远程连接详解
远程连接sql server 2008 数据库,出现下面的错误: <--在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误. 未找到或无法访问服务器.请验证实例名称是 ...
- [MyBean说明书]-如何制作BPL插件
DEMO位置: samples\simpleConsole\Lib-bpl [步骤]: 1. 首先新建一个BPL工程. 2. 添加一个窗体,实现IPluginForm接口(simpleCons ...
- SpringBoot热部署配置(基于Maven)
热部署的意思是只要类中的代码被修改了,就能实时生效,而不用重启项目.spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去.原 ...
- js的深入学习课程Object.prototype.toString.call()
1.通过 Object.prototype.toString.call() 进行类型判断 function isArray(obj) { return Object.prototype.toStrin ...
- 【转】MATLAB conv2函数的理解
另附:http://blog.csdn.net/anan1205/article/details/12313593 原文:http://blog.csdn.net/andrewseu/article/ ...
- MATLAB 2016b 切换回英文版
原因: 中文下不能使用等间距字体.因为等间距字体都是英文字体,报错信息又是中文的,所以这时候报错就全是乱码.如果改成中文字体,又不是等间距的了,看着瞎眼. 方法: Preferences->Ge ...
- Lintcode: Implement Queue by Stacks 解题报告
Implement Queue by Stacks 原题链接 : http://lintcode.com/zh-cn/problem/implement-queue-by-stacks/# As th ...