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

直接上代码:

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. Session的clear方法和flush方法

    Session Clear()与 Flush() 解释 1.Clear 方法  无论是Load 还是 Get 都会首先查找缓存(一级缓存) 如果没有,才会去数据库查找,调用Clear() 方法,可以强 ...

  2. 利用babel-cli搭建支持ES6的node环境

    现在ES6盛行,开始大量使用ES6的特性敲代码,但限于Node.js本身对ES6的特性支持的不够完备,那么需要借助于其他工具来完成. 基本上,现在都直接写ES6的代码,然后使用babel-cli提供的 ...

  3. Swift中Notification.Name这么难用怎么办

    Swift中Notification.Name这么难用怎么办 以前的发送通知的参数就是一个简单的字符串: NSNotificationCenter.defaultCenter().post(" ...

  4. 深入HBase架构解析(二)【转】

    转自:http://www.blogjava.net/DLevin/archive/2015/08/22/426950.html 前言 这是<深入HBase架构解析(一)>的续,不多废话, ...

  5. FIDDLER的使用方法及技巧总结(连载一)FIDDLER快速入门及使用场景

    FIDDLER的使用方法及技巧总结 一.FIDDLER快速入门及使用场景 Fiddler的官方网站:http://www.fiddler2.com Fiddler的官方帮助:http://docs.t ...

  6. java连接https时禁用证书验证.

    import java.io.File; import java.security.cert.CertificateException; import java.util.List; import j ...

  7. Pycharm快捷键整理(Mac)

    用过快捷键立即感觉高大上了,最主要的是很方便啊!很强大 cmd b 跳转到声明处(cmd加鼠标) opt + 空格 显示符号代码 (esc退出窗口 回车进入代码) cmd []光标之前/后的位置 op ...

  8. Apache重写RewriteCond

    RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始.基础的功能,为了方 ...

  9. JAVA-JSP内置对象之pageContext对象

    相关资料:<21天学通Java Web开发> pageContext对象1.pageContext对象不但可以用来设置page范围的属性,同样也可以用来设置其他范围属性,不过需要指定范围参 ...

  10. js实现完美身份证号有效性验证(转)

    转载自:http://www.cnblogs.com/lzrabbit/archive/2011/10/23/2221643.html 最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验 ...