簡體   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