1

クライアント アプリケーションでは、SignalR.Client を介してリアルタイム イベントを送受信します。サーバーからのイベントへのサブスクライブは、SignalR を通じて行われます。ほとんどの場合、サブスクライブ イベントは SignalR クライアント経由で SignalR ハブに送信され、その後、Reactive Extensions を使用して、そのようなイベントに応答するアプリケーションの一部が適切な IObservable にサブスクライブします。

ただし、同じオブザーバブルが複数のオブザーバーを共有するケースがいくつかあります。オブザーバブルへの各内部サブスクリプションの破棄はうまくいきますが、最後のオブザーバーが破棄された後、サーバーで特定のイベントの受信をサブスクライブ解除したいと思います。これらすべてのサブスクリプションに個別の接続を使用することだけを考えましたが、この特定のネットワーク環境では、接続がアクティブになるまでにかなりの遅延があります。

例として、クライアント アプリケーションにはコンポーネント A、B、および C があり、これらはすべて、サーバーから受信する SomeEvent にアタッチする必要があります。それらのいずれかがアクティブになると、それが最初にアクティブになる場合、アプリケーションはリモート SignalR ハブでイベントをサブスクライブする必要があります。それらのいずれかがアクティブになると、Rx を使用して、既に実装したオブザーバブル コレクションから関連するオブザーバブルに内部的にサブスクライブする必要があります (まだ存在しない場合は追加します)。A、B、または C が非アクティブになると、明らかに IDisposable サブスクリプションを破棄する必要があります。また、SignalR ハブ サーバーが最後に残っている場合は、サブスクライブを解除する必要があります。

Tl;dr : 管理された登録解除を実行して、出発するオブザーバーが最後であり、その時点でサーバー ハブでのみ登録解除しているかどうかを確認したいと思います。IObservable の「生きている」オブザーバーの数を数える効果的な方法はありますか? または、これらすべてを実装するためのより良い方法はありますか? どうもありがとう!

4

1 に答える 1

2

.Publish().RefCount()あなたが説明していることを正確に行います。各サブスクリプションに同じオブザーバブルを使用していることを確認してください。そうしないと、参照カウントが機能しません。

于 2013-04-18T00:26:08.883 に答える