在SignalR和Rx中管理共享退订

本文关键字:共享 管理 SignalR Rx | 更新日期: 2023-09-27 18:09:36

在我们的客户机应用程序中,我们通过SignalR.Client发送和接收实时事件。从服务器订阅事件是通过SignalR完成的。在大多数情况下,订阅事件通过SignalR客户端发送到SignalR集线器,然后使用响应式扩展,应用程序将响应这样一个事件的部分订阅到适当的IObservable。

然而,我们现在有一些相同的可观察对象共享多个观察者的情况。处理对可观察对象的每个内部订阅进行得很好,但是我想在处置最后一个观察者后取消在服务器上接收给定事件的订阅。我曾想过为所有这些订阅使用单独的连接,但是在这个特殊的网络环境中,在连接变为活动状态之前会有相当大的延迟。

作为一个例子,一个客户端应用程序有组件a、B和C,它们都想要附加到从服务器接收的SomeEvent。一旦它们中的任何一个变为活动状态(如果是第一个这样做的话),应用程序应该订阅远程SignalR集线器上的事件。当它们中的任何一个激活时,它应该使用Rx在内部订阅我们已经实现的可观察对象集合中的相关可观察对象(如果不存在,则添加一个)。当A、B或C变得不活动时,它显然应该处置它的一次性订阅。如果是最后一个,它应该从SignalR集线器服务器取消订阅。

Tl;dr:我想做一个托管退订,看看离开的观察者是否是最后一个,并且只有在服务器集线器上退订。是否有一种有效的方法来计算IObservable的"活"观察者的数量?或者有更好的方法来实现这一切?很多谢谢!

在SignalR和Rx中管理共享退订

.Publish().RefCount()完全符合您的描述。只要确保对每个订阅使用相同的可观察对象,否则ref计数将无法工作