使用Reactive Extensions动态连接序列

时间:2016-07-03 20:41:28

标签: c# .net system.reactive observable rx.net

我想创建一个连接动态创建的一个或多个序列的序列(在运行时)。

我尝试使用mySequence = mySequence.Concat(anotherSequence),但这会将当前订阅分为mySequence,因为每次都会创建一个新序列。

1 个答案:

答案 0 :(得分:3)

当您将一个可观察序列连接到另一个时,第一个序列必须在从第二个序列获取任何值之前结束。听起来更像是要合并两个或更多个序列 - 换句话说,只要该序列生成值,就从任何序列中获取值。

所以,如果你允许我将.Concat更改为.Merge,那么听起来你现在有这样的代码:

IObservable<long> mySequence = Observable.Interval(TimeSpan.FromSeconds(0.5)).Take(5);
IDisposable mySequenceSubscription = mySequence.Subscribe(n => Console.WriteLine(n));
IObservable<long> anotherSequence = Observable.Interval(TimeSpan.FromSeconds(0.2)).Take(5);
mySequence = mySequence.Merge(anotherSequence);

如果我跑了,我会得到这些值:

0
1
2
3
4

第二个序列未合并。

现在,如果您在创建订阅时不知道要合并的未来可观察对象是什么,那么您可以这样做:

Subject<IObservable<long>> sources = new Subject<System.IObservable<long>>();
IDisposable sourceSubscription = sources.Merge().Subscribe(n => Console.WriteLine(n));

sources.OnNext(Observable.Interval(TimeSpan.FromSeconds(0.5)).Take(5));
sources.OnNext(Observable.Interval(TimeSpan.FromSeconds(0.2)).Take(5));

现在结果如下:

0
1
0
2
3
4
1
2
3
4

这已正确合并了两个在订阅后添加的可观察对象。简单。