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相关推荐

  1. 方差分析-单因素方差分析示例 (Between Subjects)

    目录 1.从一个例子出发 2.建立零假设 3.什么是MSE和MSB 4.样本大小 5.计算MSE 6.计算MSB 7.比较MSE和MSB 8.分析差异的来源 本文将从一个例子("微笑宽容实验 ...

  2. (课程笔记)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: ...

  3. C# Subject System.Reactive.Subjects 及节流阀实现

    System.Reactive.Subjects里的Subject实现了观察者和被观察者的接口. 可以使用OnNext(T val)发布通知: 可以通过SubScribe(new Action< ...

  4. RxJava的四种Subjects:PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的理解

    RxJava的四种Subjects:PublishSubject.ReplaySubject.BehaviorSubject.AsyncSubject的理解 Subject:它既是Observable ...

  5. MySQL增删改查语句练习(grade表,student表,subjects表,result表)

    目录 问题描述 问题分析 1. 添加操作 2. 修改操作 3. 删除操作 问题实现 1. 添加测试数据 2. 根据题目要求完成crud操作 1. 将地址是西安市的更新为西安科技二路 2. 将S1001 ...

  6. 【Django】‘function‘ object has no attribute ‘subjects‘报错的解决

    项目场景 创建了一个新文件夹 myapp ,用于保存新功能模块下实现功能的代码文件 views.py . 问题描述 运行项目时,报错 'function' object has no attribut ...

  7. 理解Subjects, Principals and Credentials

    摘自:Inside Java 2 Platform Security - 2nd Ed,published by Addison Wesley,2003 8.4.1 Subjects and Prin ...

  8. 第2章【思考与练习1】一维数组访问,在subjects数组中选择并显示序号1、2、4门课的名称。二维数组访问,选择并显示scores数组的1、4行。生成由整数10~19组成的2×5的二维数组

    P25思考与练习1 1.一维数组访问. 1)在subjects数组中选择并显示序号1.2.4门课的名称,使用倒序索引选择并显示names数组中"方绮雯". 2)选择并显示names ...

  9. Unit 3: Subjects

    SUBJECTS All sentences must have an actor, the "who or what" a sentence is about. The subj ...

最新文章

  1. .net 返回datatable显示sql列名_3汇总分析-SQL
  2. FireFox 下通过 javascript 得到表单值
  3. Spring Boot的Tomcat 启动详解
  4. centos7下安装storm步骤
  5. 答网友提问,ABAP post调用外部接口遇到405 not allow
  6. 关于无效份额 和 拒绝份额
  7. ITFriend创业败局(四):菜鸟CEO的自我修养
  8. 分享:MetaModel 3.2.5 发布,数据库元模型
  9. python学习日记(匿名函数)
  10. SpringCloud stream连接RabbitMQ收发信息
  11. Qt文档阅读笔记-数据驱动测试
  12. gis等时圈怎么做_如何批量制作交通等时圈
  13. 创业过程中一定会引进纯资金投资人
  14. ArcEngine在个人地理数据库下创建要素类
  15. C/C++[codeup 2018]数列
  16. GEE开发之Landsat8_NDVI的数据分析
  17. Python实用工具,pyqt5模块,Python实现自动生成艺术签名的小工具
  18. BUCK LX_OUT Snubber电路
  19. 轻松一下:世界上最全的解酒方法
  20. HIT CSAPP LAB1

热门文章

  1. 安装MATLAB R2018a教程(Win10)
  2. python学法用法 自动刷分_微信跳一跳python怎么刷分_微信跳一跳python使用教程
  3. Docker集成kata containers
  4. SWUSTOJ #1178 密码翻译
  5. stata:stata软件教程(人大十八讲)(5) 第五章 函数与运算符
  6. 【C/C++动态内存 or 柔性数组】——对动态内存分配以及柔性数组的概念进行详细解读(张三 or 李四)
  7. 易语言添加ctrl c键,易语言怎样设置监视的热键为ctrl+1键?
  8. 浅谈一下vue created的使用
  9. 安卓与iPhone用户之间如何进行 FaceTime 通话
  10. MySQL中MyISAM引擎与InnoDB引擎性能简单测试[转]