【问题标题】:C# ReplaySubject that clears an Item after it is accessedC# ReplaySubject 在访问项目后清除它
【发布时间】:2018-03-27 01:28:56
【问题描述】:

我有一个关于如何配置 c# Reactive ReplaySubject 以使其表现出以下行为的问题:

  1. 当 OnNext() 被调用,并且还没有订阅者时,交给 OnNext() 的项目应该被缓存在 ReplaySubject 中。
  2. 当至少有一个缓存项,并且消费者订阅了 ReplaySubject 时,它会接收所有缓存项。收到 Item 后,应将其从 ReplaySubject 的缓存中删除,并且在第二个消费者订阅后不再返回。
  3. 当两个或多个消费者在添加项目之前订阅了 ReplaySubject。所有消费者都应该在调用 OnNext() 时获得传递给它的项目。 (这不是很重要,如果只有第一个或最后一个订阅者获得该项目也可以)

在 ReplaySubject 的构造函数中,我只能找到限制项目保留时间或保留项目数量的参数。

这里有更多关于我为什么要实现所描述的行为的上下文。我正在开发与蓝牙设备通信的手机应用程序。蓝牙设备可以发送应用程序接收到的通知(BT Gatt Notification)。应用收到一堆通知后,会将这些通知合并为一条消息,传递给 ReplaySubject,然后由订阅者处理。

非常感谢有关如何实现上述行为的任何提示或更适合解决我的用例的替代解决方案。

【问题讨论】:

标签: c# system.reactive


【解决方案1】:

这有几个基本问​​题:

  1. Rx 被设计为一个发布/订阅系统,可观察者对其观察者一无所知。一个例外是,如果没有人在听,observables 就不会“广播”。导致第二个问题……
  2. 重播/ReplaySubject(见编辑)需要订阅者才能运行。如果订阅者为零(如您所述),则不会缓存任何内容。

第二个问题更容易克服,只需有一个ReplaySubject 的虚拟订户即可。这只会给您留下第一个问题,即跟踪订阅者数量,然后根据该数量进行切换。

我正在尝试模拟一些东西来跟踪订阅者,但遇到了问题。除非或直到我完成这项工作,否则希望这能让您了解问题的深度。


编辑: ReplaySubject 不需要虚拟订阅者。 .Replay() 虽然可以。

【讨论】:

  • 感谢您指出问题。但是,据我了解,如果没有观察者,发布到 ReplaySubject 的值实际上会被缓存。请查看此链接introtorx.com/content/v1.0.10621.0/02_KeyTypes.html(您必须向下滚动到 ReplaySubject 部分)。如果我正确理解了这个例子,即使没有订阅者,它也会缓存第一个发布的值?
  • 对不起,你是对的。 ReplaySubject 缓存没有订阅者。但是,.Replay().Multicast(new ReplaySubject) 确实需要订阅者进行缓存。 .Replay 更常用,因为它更好地链接功能。
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
相关资源
最近更新 更多