"热交换"可观察到我的主题

时间:2017-07-21 03:45:23

标签: c# system.reactive

我有以下主题,一次性"永远不会消失"类型订阅。

var subject = new Subject<int>();
subject.Subscribe(Console.WriteLine, () => Con.WriteLine("OnComplete"));

现在上面的代码后面跟着这段代码

var sub = Observable.Return(0).Subscribe(subject);
sub.Dispose();
sub = Observable.Return(1).Subscribe(subject);

我只在控制台中看到0然后我看到&#34; OnComplete&#34;,我没有看到1.因为当一个可观察到的主题的订阅被处理时,主题可能会调用OnComplete来所有它的订阅者。无论如何要保持订阅Subject还活着吗?

我不一定要使用某个主题。

1 个答案:

答案 0 :(得分:3)

问题是,Observable.Return(0)会产生.OnNext(0)后跟.OnCompleted() subject得到的.OnNext(),并且由于Rx中的合同为零或更多{{1}其后是.OnCompleted().OnError()之一。之后,不再有.OnNext()

因此,您必须使用一种方法来避免要添加的每个可观察对象的.OnCompleted()

首先你改变你的主题:

var subject = new Subject<IObservable<int>>();

现在订阅更改为包含.Switch()

subject
    .Switch()
    .Subscribe(
        Console.WriteLine,
        () => Console.WriteLine("OnComplete"));

.Switch()仅将IObservable<IObservable<int>>展平为IObservable<int>,只输出最近的内部可观察量的值,但仅在外部可观察量完成时才完成。

然后你就这样使用它:

subject.OnNext(Observable.Return(0));
subject.OnNext(Observable.Return(1));
subject.OnCompleted();

现在你得到这个输出:

0
1
OnComplete

容易!