繁体   English   中英

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

[英]Rx Convert use of subject to Observable.Create method

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

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.如何在没有主题的情况下创建Observable?

本完美的书中列出了许多方法。 Observable.Create只是其中之一,但是为了获得像你的例子中的一系列值(1,2,3),我只想使用

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

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

2.如何将冷观察变为热点并在订阅者之间分享结果?

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

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 / Disconnect ,则可以使用RefCount功能。 另请注意, stream.Publish()与调用stream.Multicast(new Subject<T>())完全相同。

我强烈建议阅读RX中的共享:发布,重播和多播文章 ,深入解释这个主题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM