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

 更新时间:2017年03月07日 10:38:11   作者:aofengdaxia  
这篇文章主要介绍了C# 实现与现有.NET事件桥接简单实例的相关资料,需要的朋友可以参考下

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的末尾来完成)将释放包括底层事件处理程序的序列正在使用的所有资源。 这本质上是代表您取消订阅活动。

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

相关文章

  • WCF入门教程之Windows通讯接口

    WCF入门教程之Windows通讯接口

    这篇文章介绍了WCF入门教程之Windows通讯接口,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 深入多线程之:深入生产者、消费者队列分析

    深入多线程之:深入生产者、消费者队列分析

    本篇文章是对生产者与消费者队列进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 解析C#中委托的同步调用与异步调用(实例详解)

    解析C#中委托的同步调用与异步调用(实例详解)

    本篇文章是对C#中委托的同步调用与异步调用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • c# 模拟串口通信 SerialPort的实现示例

    c# 模拟串口通信 SerialPort的实现示例

    本文主要介绍了c# 模拟串口通信 SerialPort的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Windows Form 分页 具体实现

    Windows Form 分页 具体实现

    其实功能实现很简单。我做的是一个通用的分页控件。项目时间很紧,可能有点粗糙。欢迎大家斧正。不说了直接贴代码吧
    2013-12-12
  • c# 递归访问文件夹(删掉歌词文件)

    c# 递归访问文件夹(删掉歌词文件)

    今天想把我的音乐里面500首的mp3都拷到手机里,不过这些mp3都有很多层目录,而且每首歌曲都还有歌词文件,我只想留下mp3,歌词文件都删掉,就写了个小程序跑一下,比手动删快多了
    2012-06-06
  • C#监控文件夹变化的方法

    C#监控文件夹变化的方法

    这篇文章主要介绍了C#监控文件夹变化的方法,通过FileSystemWatcher类的方法来实现对文件夹的监控,是非常实用的技巧,需要的朋友可以参考下
    2014-11-11
  • C#动态加载dll扩展系统功能的方法

    C#动态加载dll扩展系统功能的方法

    这篇文章主要介绍了C#动态加载dll扩展系统功能的方法,涉及C#动态加载dll扩展的相关技巧,需要的朋友可以参考下
    2015-04-04
  • C#内存管理CLR深入讲解(上篇)

    C#内存管理CLR深入讲解(上篇)

    本文详细讲解了C#内存管理CLR的程序集和应用程序域,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • C#位运算以及实例计算详解

    C#位运算以及实例计算详解

    这篇文章主要给大家介绍了关于C#位运算以及实例计算的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07

最新评论