如何创建一个生成单个值且永远不会完成的observable

时间:2014-01-29 21:49:40

标签: c# sequence system.reactive observable

我知道Observable.Never()是一种创建永远不会完成的序列的方法,但是是否有一个扩展/清理过程来创建一个生成单个值然后永远不会完成的observable?我和Observable.Create(...)一起去吗? Observable.Concat(Observable.Return(onlyValue), Observable.Never<T>())?或者是否有内置或更多的“RXy”而不是这个?

5 个答案:

答案 0 :(得分:15)

对于您的具体问题,一个简单的选择是使用'Never'和'StartWith':

Observable.Never<int>().StartWith(5)

但是对于更一般的情况“我有一个可观察的序列会产生一些结果并最终完成而我想改变它以便它不能完成”(其中你的问题是一个特例),你的Concat想法是这样做的方式

source.Concat(Observable.Never<int>());

Observable.Concat(source, Observable.Never<int>());

答案 1 :(得分:9)

Observable.Concat(Observable.Return(onlyValue), Observable.Never<T>())似乎是合理的。无论如何,我可能会过度思考。

答案 2 :(得分:3)

这是一个通用的实用方法,可以一次完成。可以在没有源序列的情况下调用的StartWith版本,无需Never。如果你经常使用这个构造,可能会使你的代码更具可读性。

public partial class ObservableEx
{
    public static IObservable<TValue> StartWith<TValue>(TValue value)
    {
        return Observable.Create<TValue>(o =>
        {
            o.OnNext(value);
            return Disposable.Empty;
        });
    }
}

答案 3 :(得分:2)

为完整起见,这是创建版本:

Observable.Create<int>(subj => {
    // Anyone who subscribes immediately gets a constant value
    subj.OnNext(4);

    // We don't have to clean anything up on Unsubscribe
    // or dispose a source subscription
    return Disposable.Empty;
});

答案 4 :(得分:0)

这可以更简单地使用:

Observable.Return(whatever);