在Rx中从数组创建热的observable

时间:2012-07-19 17:05:46

标签: c# system.reactive reactive-programming

我该怎么做?

我有一个代码:

new int[]{1,2,3}.ToObservable().Subscribe(myObserver);

问题是这第一次调用是一个冷可观察的,所以在另一个这样的调用上:

new int[]{4,5,6}.ToObservable().Subscribe(myObserver);

myObserver根本不会触发onNext。显然是因为第一个电话发布1,2,3, END。我不希望observable调用“END”,因为我想继续订阅。是否有一个功能可以轻松地为我做这个?

3 个答案:

答案 0 :(得分:10)

你需要做这样的事情:

new int[] { 1, 2, 3, }
    .ToObservable()
    .Concat(Observable.Never<int>())
    .Subscribe(myObserver); 

new int[] { 4, 5, 6, }
    .ToObservable()
    .Concat(Observable.Never<int>())
    .Subscribe(myObserver);

关键是在observable上做.Concat(Observable.Never<int>())以防止它永远结束。

答案 1 :(得分:1)

在不知道如何在上下文中使用这些可观察量的情况下,我的第一个建议是在订阅之前Concat两个可观察量(或IEnumerable s)。

(new int[]{1,2,3}.ToObservable())
.Concat(new int[]{4,5,6}.ToObservable())
.Subscribe(myObserver)

我知道没有任何方法可以在代码中的ToObservableSubscribe调用之间插入,以获取您所追求的行为。可以编写这样的方法,但它不能与库的其余部分一起使用。

答案 2 :(得分:1)

Fwiw,要将Cold Observable变成Hot Observable,请使用Multicast:

var obs = new[] {1,2,3}.ToObservable()
    .Multicast(new Subject<int>())

// TODO: Subscribe as many people as you want

obs.Connect();  // Everyone subscribed gets 1,2,3,Completed now

obs.Subscribe(...);  // This guy gets no results