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

直接上代码:

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. 转:Android文件存储路径getFilesDir()与getExternalFilesDir的区别

    作为一个开发者,我们经常需要通过缓存一些文件到SD卡中,常见的方式就是,通过: File sdCard = Environment.getExternalStorageDirectory(); 获取S ...

  2. Function.apply()在提升程序性能方面的技巧

    我们先从Math.max()函数说起,Math.max后面可以接任意个参数,最后返回所有参数中的最大值. 比如 alert(Math.max(5,8))   //8alert(Math.max(5,7 ...

  3. ashx页面返回json字符串|jQuery 的ajax处理请求的纠结问题

    纠结,整了半天的jquery的ajax请求数据. 遇到的问题: 1 ajax方法一直进入error方法里,进入到请求的.ashx页面.这个问题,我未找到是什么原因.反正我使用了一下的代码,就好了. $ ...

  4. 每日英语:A Buying Guide to Air-Pollution Masks

    Blue skies were finally visible in the capital on Thursday after the region suffered fromseven strai ...

  5. node的http请求

    //node的http服务 'use strict' var http = require('http') var server = http.createServer(function (reque ...

  6. GCC Reference

    本文简单整理了GCC编译的命令项,可作为后续使用的参考. 编译 本文以GCC为主,默认编译*.c的c语言源代码. 源文件->可执行文件 gcc -Wall test.c -o test gcc ...

  7. 【转载】一个Sqrt函数引发的血案

    转自:http://www.cnblogs.com/pkuoliver/archive/2010/10/06/sotry-about-sqrt.html 源码下载地址:http://diducoder ...

  8. maven pom scope 含义

    maven pom scope 依赖范围控制哪些依赖在哪些classpath 中可用,哪些依赖包含在一个应用中.让我们详细看一下每一种范围: compile (编译范围) compile是默认的范围: ...

  9. 基于9款CSS3鼠标悬停相册预览特效

    基于9款CSS3鼠标悬停相册预览特效里面包含九款不同方式的相册展开特效代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="albums&q ...

  10. 基于jQuery+CSS3实现人物跳动特效

    分享一款基于jQuery+CSS3实现人物跳动特效.这是一款类似gif图片效果的CSS3动画特效代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class=& ...