C# 实现与现有.NET事件桥接简单实例

发布时间 - 2026-01-11 00:02:24    点击率:

C# 实现与现有.NET事件桥接简单实例

 Rx提供了工厂方法,以便与.NET中的现有异步源桥接,以便您可以使用由任何类型的数据流提供的丰富的组合,过滤和资源管理功能。 本主题检查FromEventPattern运算符,它允许将.NET事件作为可观察序列“导入”到Rx中。 每次引发事件时,OnNext消息将被传递到可观察的序列。 然后,您可以像任何其他可观察序列一样处理事件数据。

  Rx并不旨在替换现有的异步编程模型,如.NET事件,异步模式或任务并行库。 但是,当您尝试编写事件时,Rx的工厂方法将为您提供在当前编程模型中找不到的方便。 这对于资源维护(例如,何时取消订阅)和过滤(例如,选择要接收什么类型的数据)尤其如此。 在本主题和后面的主题中,您可以了解这些Rx功能如何帮助您进行异步编程。

将.NET事件转换为Rx可观察序列

以下示例为鼠标移动事件创建一个简单的.NET事件处理程序,并在Windows窗体的标签中打印鼠标的位置。

using System.Linq;
using System.Windows.Forms;
using System.Reactive;
using System.Reactive.Linq;
using System;
using WinForm;
using System.Reactive.Disposables;

class Program {

  static void Main() 
  {
     var lbl = new Label(); 
     var frm = new Form { Controls = { lbl } }; 
     frm.MouseMove += (sender, args) =>
     {
       lbl.Text = args.Location.ToString();
     };
     Application.Run(frm);
  }; 
}

  要将事件导入Rx,您可以使用FromEventPattern运算符,并提供将由要桥接的事件引发的EventArgs对象。 FromEventPattern运算符用于接收对象发送方和一些EventArgs的事件,并使用反射为您找到这些添加/删除方法。 然后,它将给定事件转换为具有EventPattern类型的可观察序列,该类型捕获发送方和事件参数。

  对于具有一个参数(非标准事件)的代理,可以使用FromEvent操作符,该操作符需要一对用于附加和分离处理程序的函数。

  在下面的示例中,我们将Windows窗体的鼠标移动事件流转换为可观察序列。 每次触发鼠标移动事件时,订阅者将收到OnNext通知。 然后,我们可以检查此类通知的EventArgs值,并获取鼠标移动的位置。

using System.Linq;
using System.Windows.Forms;
using System.Reactive;
using System.Reactive.Linq;
using System;
using WinForm;
using System.Reactive.Disposables;

class Program {

  static void Main() 
  {
     var lbl = new Label(); 
     var frm = new Form { Controls = { lbl } }; 
     IObservable<EventPattern<MouseEventArgs>> move = Observable.FromEventPattern<MouseEventArgs>(frm, "MouseMove");
     move.Subscribe(evt => { 
               lbl.Text = evt.EventArgs.Location.ToString(); 
            }) ;
     Application.Run(frm);
  }; 
}

  注意,在这个示例中,move变成了一个可观察的序列,我们可以进一步操作。 使用LINQ运算符的查询可观察序列主题将向您展示如何将此序列投影到点类型的集合中并过滤其内容,以便应用程序只接收满足特定条件的值。

  事件处理程序的清理由Subscribe方法返回的IDisposable对象负责。 调用Dispose(通过在此示例中到达use-block的末尾来完成)将释放包括底层事件处理程序的序列正在使用的所有资源。 这本质上是代表您取消订阅活动。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# C#  # 与现有.NET事件桥接  # 与现有.NET事件桥接详解  # 浅谈C#中的委托、事件与异步  # C#微信公众号开发 微信事件交互  # 详解C#中委托  # 事件与回调函数讲解  # C#中事件的定义和使用  # C#3.0使用EventLog类写Windows事件日志的方法  # C#自定义事件监听实现方法  # C#实现给DataGrid单元行添加双击事件的方法  # C#事件实例详解  # 鼠标  # 您可以  # 运算符  # 我们可以  # 本主题  # 桥接  # 转换为  # 在这个  # 在此  # 为您  # 并在  # 希望能  # 此类  # 将被  # 可以使用  # 所有资源  # 要将  # 为您提供  # 将此  # 谢谢大家 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  Laravel如何使用Service Container和依赖注入?(代码示例)  如何快速搭建安全的FTP站点?  Windows Hello人脸识别突然无法使用  如何用西部建站助手快速创建专业网站?  在线教育网站制作平台,山西立德教育官网?  网站制作价目表怎么做,珍爱网婚介费用多少?  如何快速生成橙子建站落地页链接?  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  深入理解Android中的xmlns:tools属性  轻松掌握MySQL函数中的last_insert_id()  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Laravel如何创建自定义Facades?(详细步骤)  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  北京企业网站设计制作公司,北京铁路集团官方网站?  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  如何将凡科建站内容保存为本地文件?  EditPlus中的正则表达式 实战(1)  如何正确下载安装西数主机建站助手?  如何彻底删除建站之星生成的Banner?  如何快速生成高效建站系统源代码?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel怎么在Controller之外的地方验证数据  智能起名网站制作软件有哪些,制作logo的软件?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  Python结构化数据采集_字段抽取解析【教程】  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  C#如何调用原生C++ COM对象详解  Laravel如何实现API速率限制?(Rate Limiting教程)  高端云建站费用究竟需要多少预算?  jquery插件bootstrapValidator表单验证详解  用yum安装MySQLdb模块的步骤方法  如何快速搭建高效WAP手机网站吸引移动用户?  WEB开发之注册页面验证码倒计时代码的实现  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  微信h5制作网站有哪些,免费微信H5页面制作工具?  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  html5audio标签播放结束怎么触发事件_onended回调方法【教程】