新闻中心

C# 如何实现一个观察者模式 - IObservable和IObserver

2025-12-07
浏览次数:
返回列表
C#中观察者模式的官方实现是IObservable和IObserver接口,它们自.NET Framework 4.0起作为Rx基础契约,比手写事件更规范、可组合,并支持取消与错误传播。

c# 如何实现一个观察者模式 - iobservable<t>和iobserver<t>

在 C# 中,观察者模式的官方实现就是 IObservable<t></t>IObserver<t></t> 接口,它们是 .NET Framework 4.0 起内置的响应式扩展(Rx)基础契约,比手写事件或自定义接口更规范、可组合、支持取消和错误传播。

核心角色与职责

IObservable<t></t> 是“被观察者”,负责管理订阅关系、推送数据。它只暴露一个 Subscribe(IObserver<t>)&lt;/t> 方法,返回 IDisposable 用于取消订阅。
IObserver<t></t> 是“观察者”,定义三个回调方法:
- OnNext(T value):接收新数据
- OnError(Exception error):接收异常通知(之后不再调用其他方法)
- OnCompleted():通知正常结束(之后不再调用其他方法)

手动实现一个简单 IObservable

适合理解原理,比如封装一个随时间推移产生数字的序列:

  • 继承 IObservable<int></int>,内部维护观察者列表(线程安全建议用 ConcurrentBag<iobserver>></iobserver>
  • Subscribe 中添加观察者,并返回一个 IDisposable 实现,用于从列表中移除该观察者
  • Task.RunTimer 模拟异步推送,在合适时机遍历观察者调用 OnNextOnCompletedOnError

注意:调用 OnNext/OnError/OnCompleted 前必须确保观察者不为 null,且每个观察者只能收到最多一次 OnErrorOnCompleted —— 这是契约关键。

更推荐:用 System.Reactive(Rx.NET)构造

手动实现易出错,实际开发中应优先使用 System.Reactive NuGet 包提供的工厂方法:

Openflow Openflow

一键极速绘图,赋能行业工作流

Openflow 88 查看详情 Openflow
  • Observable.Range(1, 5) → 推送 1~5
  • Observable.Interval(TimeSpan.FromSeconds(1)) → 每秒推送一个 long 计数
  • Observable.FromEventPattern() → 将 .NET 事件转为可观测序列
  • Observable.Create<t>(observer => { ... return () => { /* 取消逻辑 */ }; })</t> → 最灵活的手动构造方式,自动处理订阅/取消/异常捕获

例如:var source = Observable.Create<string>(o => { o.OnNext("hello"); o.OnCompleted(); return Disposable.Empty; });</string>

订阅与资源清理

调用 Subscribe 返回 IDisposable,务必妥善管理生命周期:

  • UI 场景中,在页面/控件卸载时调用 Dispose() 防止内存泄漏
  • 可用 using 语句(仅适用于同步短生命周期场景)
  • Rx 提供 CompositeDisposable 管理多个订阅,方便统一释放
  • 避免在 OnNext 中执行耗时或阻塞操作,否则会拖慢整个链路;必要时用 ObserveOn(Scheduler.ThreadPool) 切换线程

基本上就这些。用好 IObservable<t></t>IObserver<t></t> 的关键是理解“推送契约”和“生命周期责任”,而不是堆砌语法。Rx 的强大在于组合能力(WhereSelectSwitch 等),但底层仍是这两个接口在工作。

以上就是C# 如何实现一个观察者模式 - IObservable和IObserver的详细内容,更多请关注其它相关文章!


# 工作流  # 广州seo网站优化软件  # 江苏seo培训有哪些  # 2019seo工具  # 字体网站建设素材  # 网站网上推广公司  # seo为什么难  # 奶茶棒球seo  # 甘南seo网站优化厂家  # 合肥网站推广外包服务  # 网站排名优化提升快速  # 遍历  # 在实际  # 观察者模式  # 最多  # 多个  # 这是  # 应用程序  # 配置文件  # 你在  # 如何实现  # .net  # switch  # react  # c# 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  VS Code远程开发时如何处理文件权限问题  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  必由学在线入口 必由学网页版快速登录入口  快手赚钱渠道_快手收益来源  手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析  2026春节假期时间安排 2026春节假日查询  Win11截图该按哪些键 Win11截屏完整流程解析【教程】  蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  最新韩小圈网页版登录入口_官网在线观看官方链接  限制HTML日期输入框的日期选择范围  痛风发作了怎么办? 快速止痛和后期饮食调理  J*a最大堆Heapify方法修复:索引计算与边界条件深度解析  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  126邮箱网页版官方入口 126邮箱账号在线登录平台  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  HTML长属性值处理:表单action路径优化与代码规范应对  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画  Go语言中Map值调用指针接收器方法的限制与应对  PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践  Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  在Qt QML中通过Python字典动态更新TextEdit内容的教程  React中useState与局部变量:理解组件状态管理与渲染机制  Go语言中JSON数据解析与字段访问教程  Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  yy漫画网页版官方入口_yy漫画官网登录页面链接  12306选座系统怎么选连座_12306选座多人连坐操作方法  Typer应用中灵活处理命令行参数的令牌化与解析  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  excel怎么制作工资条 excel快速生成工资条的方法  J*aScript中管理异步API调用:确保操作顺序与数据一致性  LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比  Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置  b站如何看历史记录_b站观看历史找回方法  Android Studio计算器C键功能异常排查与修复教程  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道  J*aScript中赋值与自增运算符的复杂交互与执行机制  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  高德地图沿途添加点失败如何解决 高德多点规划方法 

搜索