适用场景:GUI交互、消息队列、微服务通信等需要解耦事件生产与消费的系统

🧩 模式核心组件解析

发布者(Publisher)

  • 作用:定义事件并管理订阅者列表
  • 关键行为:
    • 提供+=和-=运算符注册/注销订阅者
    • 通过Invoke()方法触发事件 (图示15-3)
  • 代码示例:
public class Incrementer {public event EventHandler CountedADozen;  // 定义事件 public void DoCounting() {for (int i=1; i<=100; i++) {if (i % 12 == 0) CountedADozen?.Invoke(this, EventArgs.Empty);  // 触发事件 }}
}

订阅者(Subscriber)

  • 职责:向发布者注册事件处理方法
  • 设计原则:
    • 方法需匹配委托签名(参数+返回值)
    • 避免长时间阻塞(影响其他订阅者)
      注册示例
public class Dozens {public void Subscribe(Incrementer publisher) {publisher.CountedADozen += OnCountedDozen;  // 注册事件 }private void OnCountedDozen(object sender, EventArgs e) {Console.WriteLine("12的倍数已累计!");}
}

事件与委托的共生关系(关键!)

  • 事件本质:对委托的封装(图示15-2)
  • 封装价值

image

  • 安全优势:阻止外部重置订阅列表,保障事件触发的确定性

⚙️ 实战设计要点

事件参数自定义

public class CountEventArgs : EventArgs {public int CurrentCount { get; set; }  // 传递计数状态 
}
// 发布者触发时传递参数 
CountedADozen?.Invoke(this, new CountEventArgs { CurrentCount = i });

多线程环境安全

// 使用原子操作避免线程竞争 
EventHandler handler = CountedADozen;
if (handler != null) {handler(this, EventArgs.Empty);
}

解耦进阶方案

  • 中介者模式:通过中间层管理事件路由(适用于复杂系统)

  • 观察者模式:定义IObservable/IObserver接口(.NET原生支持)

    💡 典型应用场景对比

image

❗ 避坑指南

内存泄漏风险

  • 问题:订阅者未注销 → 阻止GC回收对象
  • 方案:在Dispose()中执行publisher.Event -= handler

事件处理异常传播

  • 陷阱:某个订阅者抛异常 → 中断后续执行
  • 方案:独立捕获每个处理器的异常
foreach (var handler in CountedADozen.GetInvocationList()) {try { handler.DynamicInvoke(args); } catch (Exception ex) { /* 记录日志 */ }
}

技术启示:事件驱动架构通过解耦生产者与消费者,显著提升系统扩展性。掌握其底层委托机制,可避免“仅会用不懂原理”的窘境。建议结合Rx.NET或MediatR库深化实战能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87132.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87132.shtml
英文地址,请注明出处:http://en.pswp.cn/web/87132.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云Flexus+DeepSeek征文 | 从零开始搭建Dify-LLM应用开发平台:华为云全流程单机部署实战教程

华为云FlexusDeepSeek征文 | 从零开始搭建Dify-LLM应用开发平台&#xff1a;华为云全流程单机部署实战教程 前言一、华为云Dify-LLM平台介绍1. Dify-LLM解决方案简介2. Dify-LLM解决方案地址3. Dify-LLM单机架构介绍4. 预估成本说明 二、华为云Maas平台介绍1. 华为云ModelArts …

oracle集合三嵌套表(Nested Table)学习

嵌套表 嵌套表(Nested Table)是Oracle中的一种集合数据类型&#xff0c;它允许在表中存储多值属性&#xff0c;类似于在表中嵌套另一个表。 嵌套表具有以下特点&#xff1a; 是Oracle对象关系特性的一部分 可以看作是一维数组&#xff0c;没有最大元素数量限制 存储在单独…

Python学习之——单例模式

Python学习之——单例模式 参考1 利用__metaclass__实现单例super的用法class Singleton(type)元类 2 重载__new__方法实现单例模式3 利用装饰器实现单例考虑一个类如果继承一个单例类的问题 参考 python之metaclasssingleton&#xff08;一&#xff09; python之metaclasssin…

【Linux】U-boot常用命令总结

U-Boot 是嵌入式系统中常用的引导加载程序&#xff08;bootloader&#xff09;&#xff0c;它提供了一套命令行接口&#xff0c;用于调试、加载操作系统镜像以及进行硬件测试等操作。 1、变量操作命令 这些命令用于管理 U-Boot 的环境变量。 命令功能说明setenv name value设…

【Linux】不小心又创建了一个root权限账户,怎么将它删除?!

一.前言 今天在学习linux提权的时候&#xff0c;把新建的一个普通账户权限提升成了root&#xff0c; 当我练习完提权&#xff0c;想要把这个账户删掉的时候。 发现… 好家伙&#xff0c;这个根本删不掉 随后试了各种各样的方法&#xff0c;都不行&#xff0c;后来突然想到是否…

数据结构:数组(Array)

目录 什么是数组&#xff08;Array&#xff09;&#xff1f; &#x1f50d;为什么数组的下标要从 0 开始&#xff1f; 一、内存地址与偏移量的关系&#xff1a;从 0 开始是最自然的映射 二、指针的起点就是第 0 个元素的地址 三、历史原因&#xff1a;BCPL → B → C → …

视频内存太大怎么压缩变小一点?视频压缩的常用方法

视频传生活或者工作中很常见&#xff0c;如发送视频邮件、在线视频播放、视频上传下载等。未压缩的大内存视频文件传输时&#xff0c;不仅会消耗大量的网络带宽资源&#xff0c;还会使传输时间大幅增加。在网速有限的情况下&#xff0c;发送一个几 GB 的未压缩视频可能需要数小…

性能测试包括哪些方面?要掌握哪些知识

性能测试是软件测试中的一个重要方面&#xff0c;它主要关注软件在不同条件下的稳定性、可靠性和性能表现。性能测试包括多个方面&#xff0c;需要掌握的知识也相对广泛。以下是对性能测试包括的方面以及需要掌握的知识分析&#xff1a; 一、性能测试包括的方面 响应时间&…

windows的vscode无法通过ssh连接ubuntu的解决办法

现象&#xff1a; 最近在windows本地通过vscode登录ssh时发现不得劲&#xff0c;总是报错无法与”192.168.1.129“建立连接&#xff0c;如下图&#xff1a; 但是这种报错以及在输出端的信息并没有提供具体错误原因&#xff0c;于是换poweshell来登录&#xff0c;报错如下图&am…

第2章,[标签 Win32] :Windows 的字符串函数

专栏导航 上一篇&#xff1a;第2章 &#xff1a;兼容 ASCII 字符与宽字符的 Windows 函数调用 回到目录 下一篇&#xff1a;无 本节前言 在下面的文章链接里面&#xff0c;我们谈到过&#xff0c;使用兼容版的字符串处理函数的知识。 第2章 &#xff1a;编写兼容多字节字…

Java的SpringAI+Deepseek大模型实战-会话记忆【三】

文章目录 背景项目环境实现步骤第一步、定义会话存储方式方式一、定义记忆存储ChatMemory方式二、注入记忆存储ChatMemory 第二步、配置会话记忆方式一、老版本实现方式二、新版本实现 第三步、添加会话ID 异常处理1、InMemoryChatMemory 无法解析 背景 前两期搭建起大模型对话…

Python3完全新手小白的学习手册 10 文件和异常

文章目录 读取文件读取文件的全部内容 相对路径和绝对路径访问文件中的各行使用文件的内容包含100万位的大型文件圆周率值中包含你的生日吗&#xff1f; 写入文件写入一行写入多行 异常处理ZeroDivisionError异常使用try-except代码块else代码块处理FileNotFoundError异常分析文…

VC Spyglass:工具简介

相关阅读 VC Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828932.html?spm1001.2014.3001.5482 传统上&#xff0c;基于仿真的动态验证技术一直是功能验证的核心方式。随着现代SoC设计日益复杂&#xff0c;静态验证技术的引入变得愈发重要。 Synopsys的 VC Sp…

AWS RDS Aurora全局数据库转区域数据库实战指南:无缝迁移零停机

Aurora全局数据库是AWS提供的跨区域高可用解决方案,但在某些场景下,我们需要将其转换为普通区域数据库。本文将详细介绍这一转换过程,并分享关键技术要点和实战经验。 一、全局数据库与区域数据库概述 AWS RDS Aurora全局数据库是一种跨区域部署的数据库架构,主要用于灾备…

C++之路:函数重载与运算符重载

目录 函数重载运算符重载C运算符重载范围对照表注意事项 运算符重载语法全局运算符重载类内运算符重载下面以一个一元运算符为例&#xff0c;介绍特性1&#xff1a;下面介绍特性3&#xff1a;&#xff08;必须类内重载的运算符‌&#xff09; 函数重载 函数重载是指同一个作用域…

七、SpringCloud 项目迁移至 K8s

七、SpringCloud 项目迁移至 K8s 文章目录 七、SpringCloud 项目迁移至 K8s1、环境准备1.1 集群规划1.2 SpringCloud 项目架构及迁移需求分析 2、迁移 Eureka 集群2.1 构建及容器化2.2 部署至 K8s2.3 创建通信Service 3、迁移网关服务3.1 构建及容器化3.2 部署至 K8s3.3 创建Se…

通过具有一致性嵌入的大语言模型实现端到端乳腺癌放射治疗计划制定|文献速递-最新论文分享

Title 题目 End-to-end breast cancer radiotherapy planning via LMMs with consistency embedding 通过具有一致性嵌入的大语言模型实现端到端乳腺癌放射治疗计划制定 01 文献速递介绍 近年来&#xff0c;受大型语言模型&#xff08;LLM&#xff09;启发的新一代人工智…

MCP Chart Server服务本地部署案例

一、MCP Chart Server介绍 MCP Chart Server是一个专业的图表生成服务&#xff0c;支持多种图表类型&#xff0c;适用于数据可视化和分析。 MCP Chart Server是一种用于生成和呈现图表的服务器端软件。它提供了一个简单而强大的方式&#xff0c;让开发人员和系统管理员可以轻…

复合型浪涌保护器五大核心技术重构电气防护体系

开篇&#xff1a;从传统防护到智能守护的技术跨越 在电气设备面临浪涌威胁的防护场景中&#xff0c;浪涌保护器&#xff08;SPD&#xff09;始终扮演着关键角色。面对传统SPD在漏电流、续流等方面的技术局限&#xff0c;行业领先企业通过技术整合开发出复合型SPD&#xff0c;以…

c# 详细分析Task.sleep和Thread.sleep 的区别、使用场景和应用示例

文章目录 Task.Delay vs Thread.Sleep 详细分析与使用场景核心区别详细分析Thread.SleepTask.Delay 性能考量综合示例高级用法组合延迟与超时实现指数退避重试 总结建议 Task.Delay vs Thread.Sleep 详细分析与使用场景 核心区别 Task.Delay 和 Thread.Sleep 都用于在代码中引…