说明:示例借鉴自这里,但原版很不友好,于是修改了下,一目了然。

直接上代码:

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,事件发布者与订阅者的更多相关文章

  1. Publisher和Subscriber节点

    一.Publisher节点 /*"ros/ros.h"里面包含了ROS系统内最常用的一些头文件,包含此文件,便可以使用ROS的核心功能.*/#include "ros/r ...

  2. ROS学习手记 - 8 编写ROS的Publisher and Subscriber

    上一节我们完成了 message & srv 文件的创建和加入编译,这次我们要玩简单的Publisher 和 Subscriber 要玩 Publisher 和 Subscriber, 需要具 ...

  3. ros之发布者和订阅者协同工作

    前面的例子显示了单个发布者/单个订阅者的情况,但是一个节点也可以同时是一个发布者和订阅者,或者拥有多个订阅和发布. 实际上,ROS节点最常做的事情是传递消息,并在消息上进行运算. 例doubler.p ...

  4. ROS2学习之旅(14)——编写简单的发布者和订阅者(C++)

    节点是通过ROS Graph进行通信的可执行进程.在本文中,节点将通过话题以字符串消息的形式相互传递信息.这里使用的例子是一个简单的"talker"和"listener& ...

  5. javaScript 自定义事件、发布订阅设计模式

    现在很多应用都允许用户根据自己的喜好订阅一些自己较为关注的信息,当应用更新了这些信息后将针对不同的订阅类型推送此类信息.例如xx招聘网,当你订阅了互联网IT技术相关分类的招聘信息推送后,当企业在该网站 ...

  6. Writing a Simple Publisher and Subscriber

    用c++实现一个publisher/subscriber publisher #include "ros/ros.h" #include "std_msgs/String ...

  7. ROS验证publisher和subscriber

    在前面的两篇博客中我们用C++在ROS中创建了一个发布者和接收者,并使用catkin_make构建了新的节点,下面就需要验证一下,我们写的是否正确. 首先运行roscore roscore 在使用ca ...

  8. VB.net Wcf事件广播(订阅、发布)

    这篇东西原写在csdn.net上,最近新开通了博客想把零散在各处的都转移到一处.   一.源起 学WCF有一段时间了,可是无论是微软的WebCast还是其他网上的教程,亦或我购买的几本书中,都没有怎么 ...

  9. 基于EventAggregator的事件发布及订阅

    EventAggregator简介 EventAggregator是Prism中专门处理ViewModel与ViewModel之间事件传递的类对象,它提供了针对事件的发布方法和订阅方法,所以可以非常方 ...

随机推荐

  1. Spring下面的classpath 和 classpath* 区别的简单讲解

    classpath 和 classpath* 区别: classpath:只会到你指定的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar文件中(class路径) ...

  2. GitBash:修改GitBash主题配色和字体

    打开GitBash,使用命令: cd ~ 然后: vi .minttyrc 使用下列内容替换已有内容: Font=Consolas FontHeight= ForegroundColour=,, Ba ...

  3. 每日英语:How Pop Culture Influences Chinese Travelers

    Where are Chinese tourists going to next? Pop culture may hold some clues, from blockbuster rom-com ...

  4. PBR Metallic/Roughness工作流中Albedo与F0的计算方法

    首先简单回顾一下典型的纯金属与绝缘体的PBR属性: 纯金属: Albedo(diff): 0 F0(spec): >0.3 (or 0.5, epic/allegorithmic etc.) M ...

  5. Android调用Webservice发送文件

    一服务器端C#这里有三个上传方法1.uploadFile( byte []bs, String fileName); PC机操作是没有问题2. uploadImage(String filename, ...

  6. 【嵌入式】bootloader,linux,filesystem的烧写

    平台: 深圳市优龙科技有限公司的FS2410(基于ARM9) 准备: 1.用串口(UART1,J8)线与PC机相连,这个是用来传输数据和显示信息的 2.连接USB数据下载线(usb device),注 ...

  7. Java局部打印的问题

    项目中遇到了做局部打印的情况,最开始用的bootstrap,可是实际显示的和打印的效果就不一样了,于是就只能换一种方式了. 打印是用的jqprint 这个插件,很简单好用的插件. 引入两个js就可以了 ...

  8. 【转】Java中JDK和JRE的区别是什么?它们的作用分别是什么?

    原文地址:http://blog.csdn.net/qq_33642117/article/details/52143824 JDK和JRE是Java开发和运行工具,其中JDK包含了JRE,但是JRE ...

  9. 【Android开源项目分析】自定义圆形头像CircleImageView的使用和源码分析

    原文地址: http://blog.csdn.net/zhoubin1992/article/details/47258639 效果

  10. android开发(33) 让 actionbar 透明2

    让 actionbar 的背景 透明 我需要一个 透明的actionbar ,找到如下方法实现: 1. 首先,设置ActionBar 浮动到主界面上来. 2. 然后,设置ActionBar的背景色,透 ...