C#中的EventHandler观察者模式详解
作者:细胞的理想 发布时间:2021-09-04 17:08:27
C# 和 java 比较:java 中使用的是接口。C# 使用委托机制,可以用时 + 运算符进行注册,直接多播。而 java 中是一般是使用一个集合来保存观察者。
一、解释
发布者(Publisher)= 被观察者(Observable) = 事件源(java中的EventObject,C#中的sender)
订阅者(Subscriber)=观察者(Observer)= 接收者(java中继承EventLister,接口, 或Observer接口, C#由于委托机制,不需要继承接口,直接按EventHandler实现回调方法)
在发生其他类或对象关注的事情时,类或对象可通过事件通知它们。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。在典型的 C# Windows 窗体或 Web 应用程序中,可订阅由控件(如按钮和列表框)引发的事件。可使用 Visual C# 集成开发环境 (IDE) 来浏览控件发布的事件,选择要处理的事件。IDE 会自动添加空事件处理程序方法和订阅事件的代码。
EventHandler 为 C# 中的预定义委托,专用于表示不生成数据的事件的事件的处理程序方法。
public delegate void EventHandler(Object sender, EventArgs e)
二、事件具有以下特点:
1. 发行者确定何时引发事件,订户确定执行何种操作来响应该事件。
2. 一个事件可以有多个订户。一个订户可处理来自多个发行者的多个事件。
3. 没有订户的事件永远不会被调用。
4. 事件通常用于通知用户操作(如:图形用户界面中的按钮单击或菜单选择操作)。
5. 如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序。要异步调用事件,请参见使用异步方式调用同步方法。
6. 可以利用事件同步线程。
7. 在 .NET Framework 类库中,事件是基于 EventHandler 委托和 EventArgs 基类的。
实例代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleAppEventArgs
{
public class Program
{
public static void Main(string[] args)
{
Publisher pub = new Publisher();
Subscriber sub1 = new Subscriber("sub1",pub);
Subscriber sub2 = new Subscriber("sub2", pub);
// 调用这个方法来产生事件
pub.DoSomething();
Console.WriteLine("Press Enter to close this window.");
Console.ReadLine();
}
}
/// <summary>
/// 自定义一个事件类来保存事件信息
/// </summary>
public class CustomEventArgs : EventArgs
public CustomEventArgs(string s)
private string message;
public string Message
get { return message; }
set { message = value; }
/// 广播事儿件的类
public class Publisher
//使用EventHandler<T> 声明一个事件
public event EventHandler<CustomEventArgs> RaiseCustomEvent;
public void DoSomething()
//DoSomething…………
// 你也可以再触发事件前,执行一些其他的代码
OnRaiseCustomEvent(new CustomEventArgs("Did something,hi 这是事件消息"));
protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
// 定义一个局部变量,已防止最后一个订阅者刚好在检查null后取消订阅
EventHandler<CustomEventArgs> handler = RaiseCustomEvent;
// 如果没有 订阅者(观察者), 委托对象将为null
if (handler != null)
{
// 格式化事件消息中 的字符串
e.Message += String.Format(" at {0}", DateTime.Now.ToString());
// 这是最重要的一句。
// 此时执行的 handler已经是一个多播委托(如果有多个订阅者或观察者注册)。
// 既然是多播委托,就可以依次调用各个 回调函数 (既然是回调函数,实际的执行就由订阅者类决定)。
//这里面传入一个this, 就代表 事件源(或发布者 或 被观察者 都一个意思)
handler(this, e);
}
/// 用来注册事件的类
public class Subscriber
private string id;
public Subscriber(string ID, Publisher pub)
id = ID;//注册这个动作,应该有订阅者主动进行,并且可以再后期取消注册
pub.RaiseCustomEvent += HandleCustomEvent;
// 实现回调函数。在事件发生后,执行什么样的操作。这里只是简单的打印信息。
void HandleCustomEvent(object sender, CustomEventArgs e)
//这就是实际的操作。
Console.WriteLine(id + " received this message: {0}", e.Message);
}
来源:https://www.cnblogs.com/xinhuawei/p/16008177.html


猜你喜欢
- 情景模式的设置大家应当相当熟悉了,但是在Android中如何通过自己的程序进行情景模式的设置呢,情景模
- 本文实例讲述了Hibernate环境搭建与配置方法。分享给大家供大家参考,具体如下:1.下载hibernate jar包:hibernate
- 理解函数式接口以及 Lambda表达式的发展过程任何接口,只包含唯一一个抽象方法,就是函数式接口/** * lambdab表达式的发展 */
- 为什么要限流在保证可用的情况下尽可能多增加进入的人数,其余的人在排队等待,或者返回友好提示,保证里面的进行系统的用户可以正常使用,防止系统雪
- SpringCloud Gateway 简介SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基
- 前言在原生的 Android 或 iOS 中,都提供了基本的键值对存储方式,Android 是 SharedPreferences,iOS
- 在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,输入/ 就可以看到windows 提示的不能作为文件名的字符那么具体是包
- 把idea中的项目导入github仓库中步骤详解做完项目进行云端保存是很必要的,我都是存放在github中。所以废活少说直接开始啦。前提是已
- spring cloud gateway读取请求参数1. 我的版本:spring-cloud:Hoxton.RELEASEspring-bo
- Tomcat 如何实现WebSocketWebSocket协议属于HTML5标准,越来越多浏览器已经原生支持WebSocket,它能让客户端
- 本文实例讲述了WinForm中实现picturebox自适应图片大小的方法。分享给大家供大家参考,具体如下:picturebox控件共有两种
- 前言StringJoiner是Java里1.8新增的类,主要是帮助我们把一个列表拼接字符串, 或许有一部分人没有接触过. 所以本文将从使用例
- 在我们的web开发中,很多的时候都需要把本机的一些文件上传到web服务器上面去。如:一个BBS系统,当用户使用这是系统的时候,能把本机的一些
- 公司的项目底层,是使用的TCP,因为可靠,自动断线重连,在底层都实现了,但是我记得TCP也会有掉包的问题,所以这文章就诞生了——关于TCP掉
- 一、概述Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信。Socket类的方法
- import java.io.IOException;import javax.xml.parsers.*;import javax.xml
- 编写规范目的:能够在编码过程中实现规范化,为以后的程序开发中养成良好的行为习惯。1、 项目名全部小写2、 包名全部小写3、 类名首字母大写,
- 前导:发过程中经常会使用java将office系列文档转换为PDF, 一般都使用微软提供的openoffice+jodconverter 实
- #include <algorithm>class TestClass{public: int Sub(int x,
- 本文实例讲述了spring AOP定义AfterThrowing增加处理。分享给大家供大家参考,具体如下:一 配置<?xml vers