全网整合营销服务商

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

免费咨询热线: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  # 这是  # 多个  # 最多  # 遍历  # 适用于  # 这两个  # 仍是  # 自定义  # 不为  # 则会 


相关文章: 如何快速搭建高效可靠的建站解决方案?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  如何通过.red域名打造高辨识度品牌网站?  网站制作公司,橙子建站是合法的吗?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  太原网站制作公司有哪些,网约车营运证查询官网?  h5在线制作网站电脑版下载,h5网页制作软件?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  如何在建站主机中优化服务器配置?  如何打造高效商业网站?建站目的决定转化率  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  如何配置支付宝与微信支付功能?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  如何通过VPS搭建网站快速盈利?  公司门户网站制作流程,华为官网怎么做?  如何在腾讯云免费申请建站?  如何在景安服务器上快速搭建个人网站?  网站代码制作软件有哪些,如何生成自己网站的代码?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  广州美橙建站如何快速搭建多端合一网站?  如何在搬瓦工VPS快速搭建网站?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  如何用好域名打造高点击率的自主建站?  魔方云NAT建站如何实现端口转发?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何快速搭建安全的FTP站点?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  如何高效生成建站之星成品网站源码?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  建站之星价格显示格式升级,你的预算足够吗?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  建站之星CMS五站合一模板配置与SEO优化指南  免费视频制作网站,更新又快又好的免费电影网站?  建站主机CVM配置优化、SEO策略与性能提升指南  建站之星伪静态规则如何设置?  贸易公司网站制作流程,出口贸易网站设计怎么做?  西安大型网站制作公司,西安招聘网站最好的是哪个?  如何做网站制作流程,*游戏网站怎么搭建?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  如何选择服务器才能高效搭建专属网站?  建站主机无法访问?如何排查域名与服务器问题  如何在万网自助建站平台快速创建网站?  如何在建站宝盒中设置产品搜索功能?  临沂网站制作企业,临沂第三中学官方网站?  如何快速搭建高效WAP手机网站? 

您的项目需求

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