Rx将subject的使用转换为Observable.Create方法

时间:2015-12-16 09:30:32

标签: c# system.reactive

我正在尝试使用反应式扩展(Rx)来创建一个热门观察者,可以由多个用户订阅,这些用户都可以获得推送给他们的值。我可以使用以下主题来做到这一点:

var subj = new Subject<int>();
var observable = subj.AsObservable();
observable.Subscribe(x => Console.WriteLine("1 Number: {0}", x));
observable.Subscribe(x => Console.WriteLine("2 Number: {0}", x));

subj.OnNext(1);
subj.OnNext(2);
subj.OnNext(3);
  //and so on

但我已经读过,主题是用于“实验性”使用,我想使用Observable.Create工厂方法做同样的事情。我环顾四周,有很多使用Create方法创建冷可观察量的例子,但我希望有与上面代码相​​同的行为。

感谢您的帮助。

尼克

1 个答案:

答案 0 :(得分:3)

您的问题可以分为两个单独的问题。

<强> 1。如何在没有主题的情况下创建Observable?

有许多方法listed in this perfect bookvoid var_args(Args... args)只是其中之一,但为了获得一系列值,例如您的示例(1,2,3),我只想使用

Observable.Create

但是,正如您可能已经注意到的那样,以这种方式创建的流将是冷可观察的。这引出了第二个问题:

<强> 2。如何将冷观察变为热门并在订阅者之间分享结果?

为此,您需要Publish功能。它允许在订户之间共享Rx流。试试这个:

var source = Observable.Range(1, 3);

请注意,如果您不想手动拨打var sourceHot = Observable.Range(1, 3).Publish(); sourceHot.Subscribe(x => Console.WriteLine("1 Number: {0}", x)); sourceHot.Subscribe(x => Console.WriteLine("2 Number: {0}", x)); var disp = sourceHot.Connect(); / Connect,可以使用 一个RefCount函数。另请注意,Disconnect与调用stream.Publish()完全相同。

我强烈建议您阅读Sharing in RX: Publish, Replay, and Multicast article,这会深入解释这个主题。