0

0

C# Rx.NET响应式编程方法 C#如何使用Reactive Extensions处理事件流

幻夢星雲

幻夢星雲

发布时间:2026-03-07 10:42:02

|

633人浏览过

|

来源于php中文网

原创

observable.fromeventpattern 是最安全的 ui 事件订阅方式,需显式传入 add/remove 委托,wpf 用泛型重载,winforms 注意 eventhandler 类型,订阅后必须 dispose 或用 using 管理生命周期。

c# rx.net响应式编程方法 c#如何使用reactive extensions处理事件流

如何用 Observable.FromEventPattern 订阅 UI 事件

WinForms 或 WPF 中直接订阅事件(如 Button.Click)会带来手动取消订阅的麻烦,容易内存泄漏。Observable.FromEventPattern 是最常用、最安全的起点,它把 .NET 事件自动转为可组合的 IObservable<t></t>

实操建议:

  • 必须传入事件的 addHandlerremoveHandler 委托,不能只写事件名;WPF 推荐用泛型重载,避免反射开销
  • 对 WinForms 的 Control.Click,要传 EventHandler 类型,不是 EventArgs
  • 订阅后务必调用 Dispose() 或用 using(配合 ConnectableObservableRefCount() 更稳妥)
var clickStream = Observable.FromEventPattern<EventHandler, EventArgs>(
    h => button.Click += h,
    h => button.Click -= h);

ThrottleDebounce 在输入场景中怎么选

两者都用于抑制高频事件(比如 TextBox.TextChanged),但触发时机不同:Throttle 在「最后一次触发后等待指定时长」才发出,Debounce 是「每次触发都重置计时器,只在静默期结束后发最后一次」。实际效果几乎一样,但语义和底层实现不同 —— Rx.NET 当前版本中 Debounce 是推荐用法,Throttle 已标记为过时(obsolete)。

常见错误:

Post AI
Post AI

博客文章AI生成器

下载
  • Throttle 处理搜索框输入,结果发现用户快速连敲几个字后没响应 —— 因为它在第一次按键后就开始计时,后续按键不重置
  • 没指定 Scheduler 参数,默认走 ThreadPool,导致 UI 线程更新失败(需接 ObserveOn(SynchronizationContext.Current)
textBox.TextChanged
    .ToObservable()
    .Debounce(TimeSpan.FromMilliseconds(300))
    .ObserveOn(SynchronizationContext.Current)
    .Subscribe(_ => Search());

为什么 Subject<t></t> 容易引发线程安全问题

Subject<t></t> 是可同时作为 IObservable<t></t>IObserver<t></t> 的“桥梁”,但它本身不是线程安全的 —— 多个线程同时调用 OnNext 可能导致异常或数据丢失,尤其在事件回调 + 异步任务混合场景下(比如按钮点击触发 HTTP 请求,请求完成后再 OnNext)。

替代方案更可靠:

  • 优先用 AsyncSubject<t></t>(只发最后一次值,适合单次结果)或 ReplaySubject<t></t>(带缓冲,可设大小和时间窗口)
  • 若必须用 Subject,用 Synchronize() 包装: new Subject<int>().Synchronize()</int>
  • 更彻底的做法是避开 Subject,改用 Observable.Create 封装异步逻辑,由 Rx 控制生命周期

如何让 Rx 流在异常后继续运行而不是终止

Rx 流默认遇到异常就调用 OnError 并终止订阅 —— 这和传统 try/catch 不同,容易让人误以为“流挂了”。关键是要在源头或中间环节拦截异常,用 CatchRetry 恢复。

使用注意点:

  • Catch 接收一个异常并返回新的 IObservable<t></t>,常配合 Empty()Return(default) 吞掉错误
  • Retry 会重订阅整个源,不适合有副作用的操作(比如重复提交表单);RetryWhen 更可控,可用 Delay 或指数退避
  • 不要在 SubscribeOnError 回调里“忽略异常”,这只会让流真正结束
Observable.FromAsync(() => httpClient.GetStringAsync(url))
    .Catch(Observable.Return(string.Empty))
    .Subscribe(result => Console.WriteLine(result));
实际项目里最常被忽略的是调度上下文切换和资源释放时机 —— 尤其在长时间存活的 ViewModel 中,一个没 DisposeSubscription 就足以让整个页面无法 GC。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

950

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

605

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

212

2025.08.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

743

2023.08.10

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

235

2023.12.07

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

491

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

448

2023.11.14

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.8万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号