[英]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.