使用Subjects
Subject 类型实现IObservable 和IObserver ,在它既是观察者又是可观察者的意义上。您可以使用主题订阅所有观察者,然后将主题订阅到后端数据源。以这种方式,主体可以充当一组订户和源的代理。你可以使用主题实现一个自定义observable与缓存,缓冲和时间移位。此外,您可以使用主题向多个订阅者广播数据。
默认情况下,主题不通过线程执行任何同步。他们不采取调度程序,而是假定所有序列化和语法正确性由主体的调用者处理。主题简单地广播到线程安全的订户列表中的所有订阅的观察者。这样做具有减少开销和提高性能的优点。但是,如果要使用调度程序将传出调用同步到观察者,则可以使用同步方法执行此操作。
使用Subjects
在以下示例中,我们创建一个主题,订阅该主题,然后使用相同的主题向观察者发布值。 通过这样做,我们将发布和订阅组合到同一个源中。
除了获取IObserver ,Subscribe方法还有一个重载,它对onNext采用Action ,这意味着每次发布项目时都会执行该操作。 在我们的示例中,每当OnNext被调用时,该项目将被写入控制台。
Subject<int> subject = new Subject<int>();
var subscription = subject.Subscribe(x => Console.WriteLine("Value published: {0}", x),() => Console.WriteLine("Sequence Completed."));
subject.OnNext(1);subject.OnNext(2);Console.WriteLine("Press any key to continue");
Console.ReadKey();
subject.OnCompleted();
subscription.Dispose();
以下示例说明了Subject的代理和广播性质。 我们首先创建一个源序列,每1秒产生一个整数。 然后我们创建一个Subject,并将它作为观察者传递给源,以便它将接收由该源序列推出的所有值。 之后,我们创建另外两个订阅,这次以主题为源。 然后,subSubject1和subSubject2订阅将接收Subject发送的任何值(从源)。
var source = Observable.Interval(TimeSpan.FromSeconds(1));
Subject<long> subject = new Subject<long>();
var subSource = source.Subscribe(subject);
var subSubject1 = subject.Subscribe(x => Console.WriteLine("Value published to observer #1: {0}", x),() => Console.WriteLine("Sequence Completed."));
var subSubject2 = subject.Subscribe(x => Console.WriteLine("Value published to observer #2: {0}", x),() => Console.WriteLine("Sequence Completed."));
Console.WriteLine("Press any key to continue");
Console.ReadKey();
subject.OnCompleted();
subSubject1.Dispose();
subSubject2.Dispose();
不同类型的主题
Rx库中的Subject 类型是ISubject 接口的基本实现(您也可以实现ISubject 接口来创建自己的主题类型)。还存在提供不同功能的ISubject 的其他实现。所有这些类型存储通过OnNext推送到它们的一些(或所有)值,并将其广播回其观察者。这样,他们将热观察变为冷观察。这意味着,如果您多次订阅这些内容(即订阅 - >取消订阅 - >再次订阅),您将再次看到至少一个相同的值。有关热观察和冷观察的更多信息,请参阅创建和订阅简单可观察序列主题中的最后一节。
ReplaySubject存储它已发布的所有值。因此,当您订阅它时,您会自动收到已发布的值的完整历史记录,即使您的订阅可能在某些值被推出后才进入。 BehaviourSubject类似于ReplaySubject,除了它只存储它发布的最后一个值。 BehaviourSubject在初始化时还需要类型T的默认值。当主体尚未接收到其他值时,此值将发送给观察者。这意味着所有订阅者都将在订阅时立即收到一个值,除非主题已经完成。 AsyncSubject类似于Replay和Behavior主题,但它将仅存储最后一个值,并且只在序列完成时发布。对于源可观察程序热的情况,可以使用AsyncSubject类型,并且可以在任何观察者订阅之前完成。在这种情况下,AsyncSubject仍然可以提供最后一个值,并将其发布到任何未来的订阅者。
返回列表
使用Subjects相关推荐
- 方差分析-单因素方差分析示例 (Between Subjects)
目录 1.从一个例子出发 2.建立零假设 3.什么是MSE和MSB 4.样本大小 5.计算MSE 6.计算MSB 7.比较MSE和MSB 8.分析差异的来源 本文将从一个例子("微笑宽容实验 ...
- (课程笔记)Learn How to Learn: Powerful mental tools to help you master tough subjects
参考: [coursera] Learn How to Learn: Powerful mental tools to help you master tough subjects Teachers: ...
- C# Subject System.Reactive.Subjects 及节流阀实现
System.Reactive.Subjects里的Subject实现了观察者和被观察者的接口. 可以使用OnNext(T val)发布通知: 可以通过SubScribe(new Action< ...
- RxJava的四种Subjects:PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的理解
RxJava的四种Subjects:PublishSubject.ReplaySubject.BehaviorSubject.AsyncSubject的理解 Subject:它既是Observable ...
- MySQL增删改查语句练习(grade表,student表,subjects表,result表)
目录 问题描述 问题分析 1. 添加操作 2. 修改操作 3. 删除操作 问题实现 1. 添加测试数据 2. 根据题目要求完成crud操作 1. 将地址是西安市的更新为西安科技二路 2. 将S1001 ...
- 【Django】‘function‘ object has no attribute ‘subjects‘报错的解决
项目场景 创建了一个新文件夹 myapp ,用于保存新功能模块下实现功能的代码文件 views.py . 问题描述 运行项目时,报错 'function' object has no attribut ...
- 理解Subjects, Principals and Credentials
摘自:Inside Java 2 Platform Security - 2nd Ed,published by Addison Wesley,2003 8.4.1 Subjects and Prin ...
- 第2章【思考与练习1】一维数组访问,在subjects数组中选择并显示序号1、2、4门课的名称。二维数组访问,选择并显示scores数组的1、4行。生成由整数10~19组成的2×5的二维数组
P25思考与练习1 1.一维数组访问. 1)在subjects数组中选择并显示序号1.2.4门课的名称,使用倒序索引选择并显示names数组中"方绮雯". 2)选择并显示names ...
- Unit 3: Subjects
SUBJECTS All sentences must have an actor, the "who or what" a sentence is about. The subj ...
最新文章
- .net 返回datatable显示sql列名_3汇总分析-SQL
- FireFox 下通过 javascript 得到表单值
- Spring Boot的Tomcat 启动详解
- centos7下安装storm步骤
- 答网友提问,ABAP post调用外部接口遇到405 not allow
- 关于无效份额 和 拒绝份额
- ITFriend创业败局(四):菜鸟CEO的自我修养
- 分享:MetaModel 3.2.5 发布,数据库元模型
- python学习日记(匿名函数)
- SpringCloud stream连接RabbitMQ收发信息
- Qt文档阅读笔记-数据驱动测试
- gis等时圈怎么做_如何批量制作交通等时圈
- 创业过程中一定会引进纯资金投资人
- ArcEngine在个人地理数据库下创建要素类
- C/C++[codeup 2018]数列
- GEE开发之Landsat8_NDVI的数据分析
- Python实用工具,pyqt5模块,Python实现自动生成艺术签名的小工具
- BUCK LX_OUT Snubber电路
- 轻松一下:世界上最全的解酒方法
- HIT CSAPP LAB1
热门文章
- 安装MATLAB R2018a教程(Win10)
- python学法用法 自动刷分_微信跳一跳python怎么刷分_微信跳一跳python使用教程
- Docker集成kata containers
- SWUSTOJ #1178 密码翻译
- stata:stata软件教程(人大十八讲)(5) 第五章 函数与运算符
- 【C/C++动态内存 or 柔性数组】——对动态内存分配以及柔性数组的概念进行详细解读(张三 or 李四)
- 易语言添加ctrl c键,易语言怎样设置监视的热键为ctrl+1键?
- 浅谈一下vue created的使用
- 安卓与iPhone用户之间如何进行 FaceTime 通话
- MySQL中MyISAM引擎与InnoDB引擎性能简单测试[转]