Ich habe ein Observable, das einen Strom von Aktienkursen darstellt. Wenn sich in meiner beobachtbaren Sequenz keine Beobachter befinden, würde ich gerne die Verbindung zu dem Remote-Server trennen können, der den Preisstrom liefert, aber das möchte ich nicht tun, bis jeder Beobachter Dispose () aufgerufen hat. In ähnlicher Weise möchte ich, wenn die erste Person Subscribe aufruft, die Verbindung zum Remote-Server wiederherstellen.
Gibt es eine Möglichkeit herauszufinden, wie viele Beobachter subskribiert haben? Oder vielleicht eine Art zu wissen, wann Beobachter Subscribe oder Dispose anrufen?
Ich würde einfach RefCount / Publish verwenden. Ich habe immer das Gefühl, wenn ich IObservable implementiere, arbeite ich viel zu hart.
%Vor%Dies wird dazu führen, dass Ihr beobachtbares Signal nicht mehr pulsiert, nachdem alle die Verbindung getrennt haben. Hier ist ein Beispiel:
%Vor%Dies deckt nicht den Fall ab, in dem Sie eigentlich die Nummer von Abonnenten wissen möchten, aber ich denke, das passt zu Ihren Anforderungen, die Arbeit zu stoppen, wenn keine Abonnenten vorhanden sind.
Es war ein bisschen alt, aber ich stieß auf diesen Beitrag, da ich ein Problem hatte, wo ich die Anzahl der Abonnenten kennen musste. Mit Bart's Vorschlag kam ich auf diese Erweiterung.
%Vor% IObservable<T>
ist eine Schnittstelle , die Sie implementieren können. In der Subscribe-Methode der Schnittstelle können Sie Beobachter überwachen, indem Sie eine Liste intern führen.
Das folgende Code-Snippet stammt von MSDN.
%Vor%Im Allgemeinen implementieren Sie IObservable nicht; Normalerweise gibt es bereits etwas in Rx, das dir helfen kann, entweder direkt oder durch Komposition. Wenn Sie jemals IObservable implementieren müssen, verwenden Sie Observable.Create, um alle für den Beobachtervertrag erforderlichen Garantien zu erhalten, usw.
Was Ihr Problem anbetrifft - der Vorschlag, Publish und RefCount zu verwenden, ist genau die Komposition, nach der Sie suchen. Wenn Sie sich aus irgendeinem Grund selbst zählen möchten, verwenden Sie Observable.Defer, um Abonnements abzufangen, möglicherweise mit Observable.Finally, um Sequenzabbrüche abzufangen. Oder wickeln Sie die Quelle mit einem Observable.Create ein, leiten Sie den Beobachter an die umbrochene Sequenz weiter und wickeln Sie das zurückgegebene IDisposable mit der Zähllogik um (mithilfe von Disposable.Create).
Prost,
-Bart (Rx-Team)
Tags und Links c# system.reactive