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之间事件传递的类对象,它提供了针对事件的发布方法和订阅方法,所以可以非常方 ...
随机推荐
- Stochastic Gradient Descent收敛判断及收敛速度的控制
要判断Stochastic Gradient Descent是否收敛,可以像Batch Gradient Descent一样打印出iteration的次数和Cost的函数关系图,然后判断曲线是否呈现下 ...
- SVN四部曲之SVN设置详解深入
想知道不同的设置是干什么用的,你只需将鼠标指针在编辑框/选项框上停留一秒钟...一个帮助提示气泡就会弹出来. 常规设置 图 4.68. 设置对话框,常规设置页面 这个对话框允许你指定自己喜欢的语言,同 ...
- ossec变更alert等级及配置邮件预警
一.场景 当攻击者尝试使用字典对某一台主机的sshd服务进行暴力破解的时候,如果我们能第一时间受到攻击预警的邮件的话,对安全人员或者运维人员来说都能做出快速响应.而使用ossec恰巧可以完成这一工作, ...
- (原创)c++11改进我们的模式之改进单例模式
我会写关于c++11的一个系列的文章,会讲到如何使用c++11改进我们的程序,本次讲如何改进我们的模式,会讲到如何改进单例模式.观察者模式.访问者模式.工厂模式.命令模式等模式.通过c++11的改进, ...
- 【转帖】(一)unity4.6Ugui中文教程文档-------概要
原帖至上,移步请戳:(一)unity4.6Ugui中文教程文档-------概要 unity4.6中的一个重要的升级就是GUI ,也把它称为UGUI ,废话我不多说,大家可以百度了解一下. 虽然现在处 ...
- asp.net正则匹配嵌套Html标签
废话不多说,直接代码 1.要匹配的html代码 <div class="conItem" id="footer"> <a id="g ...
- Lintcode: Interleaving Positive and Negative Numbers 解题报告
Interleaving Positive and Negative Numbers 原题链接 : http://lintcode.com/zh-cn/problem/interleaving-pos ...
- LeetCode: Reverse Nodes in k-Group 解题报告
Reverse Nodes in k-Group Given a linked list, reverse the nodes of a linked list k at a time and ret ...
- Domain应用之 根据某个Many2one的对象的 X2many对象 过滤
如果两者都是many2one类型的对象,过滤非常简单,在xml中添加domain过滤即可,比如 国家.省市之间的联动关系. 如果想要根据某个对象的X2many类型的字段进行过滤该如何去做呢? 答案是利 ...
- Git做代码增量发布的重要用法 - --diff-filter
你以为有 bash git diff --name-only 就够了,NO! 对于PHP开发的系统来说,增量发布,一般只需部署新增的文件和有变动的文件,但很多时候,文件是删除的或重构成其它文件名或重构 ...