探索Rx的主要接口

  IObservable / IObserver 接口在.NET Framework 4.0基类库中可用,并且它们包含在可以安装在.NET 3.5,Silverlight 3和4以及Javascript中的包中。

IObservable/IObserver

  Rx将异步和基于事件的数据源公开为基于推送的可观察序列,由.NET Framework 4.0中的新IObservable 接口抽象。 这个IObservable 接口是用于基于拉的,可枚举集合的熟悉的IEnumerable 接口的双重。 它表示可以观察到的数据源,这意味着它可以向任何有兴趣的人发送数据。 它维护一个代表这种感兴趣的监听器的依赖IObserver 实现的列表,并且自动地通知它们任何状态变化。

  IObservable 接口的实现可以被视为类型T的元素的集合。因此,IObservable 可以被视为整数的集合,其中整数将被推送到订阅的观察者

  如“什么是Rx”中所述,推送模型的另一半由IObserver 接口表示,它表示通过订阅注册兴趣的观察者。 随后将项目从其订阅的可观察序列递送给观察者。

  为了从observable集合接收通知,您使用IObservable的Subscribe方法为其传递IObserver 对象。 作为对此观察者的回报,Subscribe方法返回一个IDisposable对象,作为订阅的句柄。 这允许您在完成后清理订阅。 在此对象上调用Dispose将观察者从源分离,以便不再传递通知。 正如你可以推断,在Rx中,不需要像.NET事件模型中那样显式取消订阅事件。

  观察者支持三个发布事件,由接口的方法反映。 当可观察的数据源具有可用的数据时,OnNext可以被调用零次或更多次。 例如,用于鼠标移动事件的可观察数据源可以在每次鼠标移动时发出一个Point对象。 其他两种方法用于指示完成或错误。

  下面列出了IObservable / IObserver 接口。

  

public interface IObservable<out T>
{
   IDisposable Subscribe(IObserver<T> observer);
}
public interface IObserver<in T>
{
   void OnCompleted();// Notifies the observer that the source has finished sending messages.
   void OnError(Exception error); // Notifies the observer about any exception or error.
   void OnNext(T value);          // Pushes the next data value from the source to the observer.
} 

  Rx还提供了Subscribe扩展方法,以便您可以自己避免实现IObserver 接口。 对于可观察序列的每个发布事件(OnNext,OnError,OnCompleted),可以指定将调用的委托,如下面的示例所示。 如果不为事件指定操作,则将发生默认行为。

IObservable<int> source = Observable.Range(1, 5); //creates an observable sequence of 5 integers, starting from 1
IDisposable subscription = source.Subscribe(
                            x => Console.WriteLine("OnNext: {0}", x), //prints out the value being pushed
                            ex => Console.WriteLine("OnError: {0}", ex.Message),
                            () => Console.WriteLine("OnCompleted"));

  您可以将可观察序列(例如鼠标悬停事件的序列)看作是正常集合。 因此,您可以在集合上编写LINQ查询以执行过滤,分组,合成等操作。为了使可观察序列更有用,Rx程序集提供了许多工厂LINQ运算符,因此您不需要自己实现任何这些 。 这将在使用LINQ运算符的查询可观察序列主题。

  

警告:

您不需要自己实现IObservable / IObserver 接口。 Rx为您提供这些接口的内部实现,并通过Observable和Observer类型提供的各种扩展方法暴露它们。 有关详细信息,请参阅创建和查询可观察序列主题

 原文地址:https://msdn.microsoft.com/en-us/library/hh242974(v=vs.103).aspx 基本基于google翻译的

  返回

时间: 2024-08-04 05:27:35

探索Rx的主要接口的相关文章

PHP内核探索:从SAPI接口开始

SAPI:Server Application Programming Interface 服务器端应用编程端口.研究过PHP架构的同学应该知道这个东东的重要性,它提供了一个接口,使得PHP可以和其他应用进行交互数据. 本文不会详细介绍每个PHP的SAPI,只是针对最简单的CGI SAPI,来说明SAPI的机制. 我们先来看看PHP的架构图: SAPI指的是PHP具体应用的编程接口, 就像PC一样,无论安装哪些操作系统,只要满足了PC的接口规范都可以在PC上正常运行, PHP脚本要执行有很多种方

探索typescript的必经之路-----接口(interface)

TypeScript定义接口熟悉编程语言的同学都知道,接口(interface)的重要性不言而喻.?很多内容都会运用到接口.typescrip中的接口类似于java,同时还增加了更灵活的接口类型,包括属性.函数.可索引和类等,要想对typescript的操作进行更深入的了解,接口是必须接触到的.今天我就为大家分享一下,如何使用接口. 一. 为什么要使用接口1.1. JavaScript存在的问题我们在JavaScript中定义一个函数,用于获取一个用户的姓名和年龄的字符串:const getUs

PHP内核探索:zend_execute的具体执行过程

PHP内核探索:zend_execute的具体执行过程 解释器引擎最终执行op的函数是zend_execute,实际上zend_execute是一个函数指针,在引擎初始化的时候zend_execute默认指向了execute,这个execute定义在{PHPSRC}/Zend/zend_vm_execute.h: ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)   {       zend_execute_data *execut

《PHP内核探索系列文章》系列技术文章整理收藏

<PHP内核探索系列文章>系列技术文章整理收藏 PHP内核探索系列文章收藏夹收藏有关PHP内核方面的知识的文章,对PHP高级进阶的朋友提供PHP内核方面的知识点探讨 1PHP内核探索:从SAPI接口开始 2PHP内核探索:一次请求的开始与结束 3PHP内核探索:再次探讨SAPI 4PHP内核探索:Apache模块介绍 5PHP内核探索:Zend引擎 6PHP内核探索:多进程/线程的SAPI生命周期 7PHP内核探索:单进程SAPI生命周期 8PHP内核探索:一次请求生命周期 9PHP内核探索:

PHP内核探索:变量存储与类型

先回答前面一节的那个问题吧. 01 <?php 02 $foo = 10; 03 $bar = 20; 04    05 function change() { 06     global $foo; 07     //echo '函数内部$foo = '.$foo.'<br />'; 08     //如果不把$bar定义为global变量,函数体内是不能访问$bar的 09     $bar = 0; 10     $foo++; 11 } 12    13 change(); 14

____PHP内核探索:命名空间

PHP内核探索:命名空间 命名空间是一种特殊的作用域 感谢 参考或原文 www.php-internal.com 服务器君一共花费了81.974 ms进行了3次数据库查询,努力地为您提供了这个页面. 试试阅读模式?希望听取您的建议 在维基百科中,对命名空间的定义是: 命名空间(英语:Namespace)表示标识符(identifier)的上下文(context).一个标识符可在多个命名空间中定义, 它在不同命名空间中的含义是互不相干的.在编程语言中,命名空间是一种特殊的作用域,它包含了处于该作用

自定义RxJava

0-任务 1-同步方式 2-异步方式 3-异步包装方式 4-异步拆分方式 5-异步映射方式 6-异步Lambda方式 7-目标RxJava方式 0-任务 我们有个 Web API,获取指定标签的所有新闻列表,每条新闻包含时间和内容等. 我们的任务就是下载新闻列表,选择最新的新闻,然后保存在本地. 假设第三方提供的jar里面提供了Api和ApiImpl,不可再更改: 假设getNewsList耗时1.5秒,save耗时0.5秒 1.接口: public interface Api { //同步方式

我们为什么要在Android中使用RxJava

本文翻译来自–>Why should we use RxJava on Android 另外: 微凉一季 再另外: 微凉一季 感觉RxJava近期风生水起,不学习一下都不好意思了.洒家也是初学RxJava,也是感觉代码好像更复杂更难懂了.看了一篇外文感同身受,简单翻译一下.本文简介使用RxJava优势所在.但可能须要有一点RxJava基础,推荐先看一下抛物线的那篇经典的匠心写作. -–华丽切割线.译文開始--- Reactive Extensions (Rx) 是一系列接口和方法.为开发人员提供

[Effective JavaScript 笔记]第58条:区分数组对象和类数组对象

示例 设想有两个不同类的API.第一个是位向量:有序的位集合 var bits=new BitVector(); bits.enable(4); bits.enable([1,3,8,17]); bits.bitAt(4);//1 bits.bitAt(8);//1 bits.bitAt(9);//0 enable方法被重载了,可以传入一个索引或索引的数组.第二个类的API是字符串集合:无序的字符串集合 var set=new StringSet(); set.add('Hamlet'); se