2013-04-17 1 views
1

클라이언트 애플리케이션에서 우리는 SignalR.Client를 통해 실시간 이벤트를 송신 및 수신합니다. 서버의 이벤트 구독은 SignalR을 통해 수행됩니다. 대부분의 경우 Subscription 이벤트는 SignalR 클라이언트를 통해 SignalR 허브로 전송 된 다음 Reactive Extensions를 사용하여 해당 이벤트에 응답하는 응용 프로그램의 일부가 적절한 IObservable에 가입합니다.SignalR 및 Rx에서 공유 수신 거부 관리

그러나 이제 동일한 관찰 가능 항목이 여러 관찰자를 공유하는 경우가 있습니다. observable에 대한 각 내부 구독을 삭제하면 잘 진행되지만, 마지막 관찰자가 삭제 된 후 서버에서 주어진 이벤트 수신을 취소하고 싶습니다. 나는이 모든 구독에 대해 별도의 연결을 사용하는 것에 대해 생각해 보았습니다. 그러나이 특정 네트워크 환경에서는 연결이 활성화되기 전에 상당한 시간이 지연됩니다.

예를 들어 클라이언트 응용 프로그램에는 서버에서 SomeEvent에 수신하려는 모든 구성 요소 A, B 및 C가 있습니다. 이들 중 하나가 활성화되면, 먼저 애플리케이션이 원격 SignalR 허브의 이벤트에 가입해야합니다. ANY가 활성화되면 Rx를 사용하여 이미 구현 된 관찰 가능 콜렉션에서 해당 관측 대상에 내부적으로 가입해야합니다 (이미 존재하지 않는 경우 하나 추가). A, B 또는 C가 비활성 상태가되면 IDisposable 구독을 처리해야합니다. 이면 이면이면 마지막으로 남은 것입니다.

Tl; dr : 퇴장하는 관측통이 마지막 관측자인지, 그 시점에서 서버 허브에서만 수신 거부 중인지 확인하려면 관리 된 수신 거부를하고 싶습니다. IObservable의 "살아있는"관찰자 수를 세는 효과적인 방법이 있습니까? 아니면이 모든 것을 구현하는 다른 방법이 더 나은가요? 감사합니다.

+1

SignalR.Client Hubservable 클래스를 사용하고 있습니까? – halter73

+0

@ halter73 아니요, 처음 들어 봤습니다. 나는 Wiki에 있다고 생각하지 않는다. (당장 어쨌든). – UtopiaLtd

+0

Hubservable에 대한 문서는 어디에서 찾을 수 있습니까? 모두 내가 찾는 방법과 소스 코드 목록 일뿐입니다. – UtopiaLtd

답변

2

.Publish().RefCount() 정확히 무엇을 설명하고 있습니다. 각 구독에 대해 동일한 관찰 대상을 사용했는지 확인하십시오. 그렇지 않으면 참조 수가 작동하지 않습니다.

+0

우수합니다, 이것은 제가 찾고 있던 일종의 것입니다! 고맙습니다! – UtopiaLtd