全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

和iobserver">

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

核心角色与职责

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

手动实现一个简单 IObservable

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

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

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

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

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

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

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

订阅与资源清理

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

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

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


# c#  # react  # switch  # .net  # String  # NULL  # 封装  # select  # Error  # int  # 继承  # 接口  #   # using  # 线程  # var  # 事件  # 异步  # ui  # 这是  # 多个  # 最多  # 遍历  # 适用于  # 这两个  # 仍是  # 自定义  # 不为  # 则会 


相关文章: Python如何创建带属性的XML节点  如何通过VPS建站实现广告与增值服务盈利?  如何在局域网内绑定自建网站域名?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  网页设计与网站制作内容,怎样注册网站?  建站主机无法访问?如何排查域名与服务器问题  宝塔Windows建站如何避免显示默认IIS页面?  C#如何序列化对象为XML XmlSerializer用法  香港服务器WordPress建站指南:SEO优化与高效部署策略  为什么Go需要go mod文件_Go go mod文件作用说明  如何彻底删除建站之星生成的Banner?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  已有域名如何免费搭建网站?  大同网页,大同瑞慈医院官网?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  代刷网站制作软件,别人代刷火车票靠谱吗?  自助网站制作软件,个人如何自助建网站?  建站之星伪静态规则如何正确配置?  代购小票制作网站有哪些,购物小票的简要说明?  建站上传速度慢?如何优化加速网站加载效率?  css网站制作参考文献有哪些,易聊怎么注册?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  如何通过VPS搭建网站快速盈利?  浅谈Javascript中的Label语句  如何快速搭建响应式可视化网站?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  建站之星导航菜单设置与功能模块配置全攻略  临沂网站制作企业,临沂第三中学官方网站?  建站主机如何选?性能与价格怎样平衡?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  如何制作网站标识牌,动态网站如何制作(教程)?  如何通过山东自助建站平台快速注册域名?  如何在VPS电脑上快速搭建网站?  如何自定义建站之星网站的导航菜单样式?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  建站之星如何取消后台验证码生成?  如何在Windows环境下新建FTP站点并设置权限?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  如何通过二级域名建站提升品牌影响力?  如何用西部建站助手快速创建专业网站?  表情包在线制作网站免费,表情包怎么弄?  如何用AWS免费套餐快速搭建高效网站?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  建站之星Pro快速搭建教程:模板选择与功能配置指南  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  javascript中对象的定义、使用以及对象和原型链操作小结  建站主机系统SEO优化与智能配置核心关键词操作指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。