C#-10 事件
一 发布者和订阅者
很多时候都有这种需求,当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知。
发布者/订阅者模式可以满足这种需求。

发布者:发布某个事件的类或结构,其他类可以在该事件发生时得到通知。
订阅者:注册并在事件发生时得到通知的类或结构。
事件处理程序:由订阅者注册到事件的方法,在发布者触发事件时执行。
触发事件:当事件触发时,所有注册到它的方法会被依次调用。
事件包含了一个私有的委托,事件提供了其私有的委托的结构化访问。
二 事件的使用
2.1 声明事件
class Incrementer
{
//声明一个CoutedADozen事件
public event EventHandler CountedADozen;
}
事件声明在一个类中,通过event关键字声明。
需要委托类型的名称(如:EventHandler),任何注册到事件的处理程序都必须与委托相匹配。
事件是成员,事件成员被隐式自动初始为null。
BCL声明了一个叫做EventHandler的委托,专门用于系统事件。
2.2 订阅事件
订阅者向事件添加事件处理程序。对于一个要添加到事件的处理程序来说,它必须具有与事件的委托相同的返回类型和签名。
订阅事件的几种形式:
//订阅事件的几种形式
incrementer.CountedADozen += IncrementDozensCount; //方法引用形式,实例方法
incrementer.CountedADozen += ClassB.CountHandlerB; //方法引用形式,静态方法
incrementer.CountedADozen += new EventHandler(cc.CountHandleC); //委托形式
和委托一样,也可以使用匿名方法和Lambda表达式来添加事件处理程序。
2.3 触发事件
下附简单的包含发布者和订阅者程序。
delegate void Handler(); //声明委托 class Incrementer
{
public event Handler CountedADozen; //声明事件并发布 public void DoCount()
{
for (int i = 0; i < 100; i++)
{
if (i % 10 == 0)
{
if (CountedADozen != null)
{
CountedADozen(); //先判断事件是否为null,再触发事件
}
// 简化事件触发语法: CountedADozen?.Invoke();
}
}
}
} class Dozens
{
public int DozensCount { get; private set; } public Dozens(Incrementer incrementer)
{
incrementer.CountedADozen += IncrementDozensCount; //订阅事件
} //事件处理程序
private void IncrementDozensCount()
{
DozensCount++;
}
} class Program
{
static void Main(string[] args)
{
var incrementer = new Incrementer();
var dozens = new Dozens(incrementer); incrementer.DoCount();
Console.WriteLine($"Number of dozens = {dozens.DozensCount}");
Console.Read();
}
}
2.4 移除事件处理程序
incrementer.CountedADozen -= IncrementDozensCount; //移除事件处理程序
如果一个处理程序向事件注册了多次,那么当执行命令移除处理程序时,将只移除列表中该处理程序的最后一个实例。
C#-10 事件的更多相关文章
- nodeJS学习(10) --- 事件模块
转载:http://www.cnblogs.com/zhongweiv/p/nodejs_events.html 目录 简介及资料 事件常用函数及使用 emitter.on(event, listen ...
- android 10 事件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layo ...
- 经典线程同步 事件Event
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...
- 委托和事件[delegate and event]_C#
委托和事件: 1. 委托:一个能够表示方法的数据类型:它将方法作为对象封装起来,允许在运行时间接地绑定一个方法调用. 2. 声明委托数据类型: public delegate bool Greate ...
- 多线程面试题系列(6):经典线程同步 事件Event
上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的"线程所有权"特性所以关键段只能用于线程的互斥而不能用于同步.本篇介绍用事件Event来尝试解决这个线程同步问题.首先 ...
- WPF 学习笔记 路由事件
1. 可传递的消息: WPF的UI是由布局组建和控件构成的树形结构,当这棵树上的某个节点激发出某个事件时,程序员可以选择以传统的直接事件模式让响应者来响应之,也可以让这个事件在UI组件树沿着一定的方向 ...
- 浏览器根对象window之事件
1. [事件]动画 onanimationstart onanimationend onanimationiteration onwebkitanimationend onwebkitanimatio ...
- 转--- 秒杀多线程第六篇 经典线程同步 事件Event
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...
- 《锋利的jQuery》读书笔记(DOM+事件)
前阵子买了一批书,就从锋利的jQuery看起吧,书中一些太过常规以及没有强记必要性的操作就不记录了. 1.DOM加载后执行JS $(document).ready(function(){ //.... ...
随机推荐
- sqlDeveloper工具快速入门
场景 我们在连接oracle数据库的时候 常用方式一般有以下三种: pl/sql deceloper navicat sqlDeveloper 其中, pl/sql developer是最经典的,也是 ...
- shell中各种括号的用法
一.单小括号()1.将某个命令的返回值作为某个变量的值进行传递 #!/bin/bash USER=$(whoami) echo $USER [root@jump ~]# for i in $(seq ...
- C#中引用类型的变量做为参数在方法调用时加不加 ref 关键字的不同之处
一直以为对于引用类型做为参数在方法调用时加不加 ref 关键字是没有区别的.但是今天一调试踪了一下变量内存情况才发现大有不同. 直接上代码,结论是:以下代码是使用了 ref 关键字的版本.它输出1 ...
- InnoDB 中不同SQL语句设置的锁
锁定读.UPDATE 或 DELETE 通常会给在SQL语句处理过程扫描到的每个索引记录上设置记录锁.语句中是否存在排除该行的WHERE条件并不重要.InnoDB不记得确切的WHERE条件,但只知道哪 ...
- [原创] RestartPC64-中文版v1.0.0.9
原来发布的RestartPC-中文版和英文版v1.0.0.5,在PE64下无效.所以重新编译了64位版的RestartPC64-中文版v1.0.0.9,可以在PE64下面.正常Win64系统下面重启关 ...
- BZOJ4580/Luogu3147 [Usaco2016 Open]248
amazing #include <iostream> #include <cstdio> #include <cstring> #include <algo ...
- Luogu1137 旅行计划 (拓扑排序)
每次入队时DP : \(f[v] = \max \{f[u] + 1\}\) #include <iostream> #include <cstdio> #include &l ...
- Unity3D学习笔记12——渲染纹理
目录 1. 概述 2. 详论 3. 问题 1. 概述 在文章<Unity3D学习笔记11--后处理>中论述了后处理是帧缓存(Framebuffer)技术实现之一:而另外一个帧缓存技术实现就 ...
- mybatisplus-Service CRUD 接口
通用 Service CRUD 封装IService (opens new window)接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前 ...
- PerfView专题 (第十一篇):使用 Diff 功能洞察 C# 内存泄漏增量
一:背景 去年 GC架构师 Maoni 在 (2021 .NET 开发者大会) [https://ke.segmentfault.com/course/1650000041122988/section ...