管理SignalR和Rx中的共享取消订阅

时间:2013-04-17 16:15:13

标签: c# signalr system.reactive signalr.client

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

但是,我们现在有一些情况,相同的观察者共享多个观察者。将每个内部订阅处理为observable都很顺利,但我想在最后一个观察者处理后取消订阅在服务器上接收给定事件。我已经考虑过为所有这些订阅使用单独的连接,但是在这个特定的网络环境中,在连接变为活动之前会有相当长的延迟。

作为示例,客户端应用程序具有组件A,B和C,它们都希望附加到从服务器接收的SomeEvent。一旦它们中的任何一个变为活动状态,如果它首先这样做,则应用程序应该订阅远程SignalR集线器上的事件。当它们中的任何一个变为活动状态时,它应该在内部使用Rx从我们已经实现的可观察集合中订阅相关的observable(如果尚不存在,则添加一个)。当A,B或C变为非活动状态时,它显然应该处理其IDisposable订阅。它取消订阅SignalR中心服务器,如果它是最后一个。

Tl; dr :我想进行托管取消订阅,以查看即将离开的观察者是否是最后一个,并且此时仅取消订阅服务器中心。有没有一种有效的方法来计算IObservable的“活”观察者的数量?或者更好的方法来实现所有这些?非常感谢!

1 个答案:

答案 0 :(得分:2)

.Publish().RefCount()正是你所描述的。只需确保为每个订阅使用相同的observable,否则引用计数将不起作用。