Rx.Net使用Observable.Create代替Subject

时间:2019-01-29 20:43:17

标签: c# rx.net

我有使用主题创建可观察对象的代码。我可以使用subject.onNext(value)将值传递给可观察的流。问题是,如果在值传递后我订阅了该可观察值,则我仍希望获得该值。据我所知,主体没有抓住价值,他们只是像事件一样传递它们。因此,如何将这段代码从使用subject更改为使用Observable。

private readonly Subject<int> _valueSubject = new Subject<int>();
public IObservable<int> ValueObservable => _valueSubject ;

public void SetValue(int valuePassedIn)
{
    _valueSubject.OnNext(valuePassedIn);            
}

编辑:发现您可以使用BehaviorSubject获取最新值,但仍然想知道如何在这种情况下使用Observable.Create而不是Subject。

1 个答案:

答案 0 :(得分:0)

假设您不需要直接调用OnNext,那么您可能想要一个冷的可观察对象:

IObservable<int> coldObservable = Observable.Create<int>(obs =>
{
    obs.OnNext(1);
    obs.OnNext(2);
    obs.OnNext(3);
    obs.OnCompleted();
    return () => { };
});

否则,ReplaySubject将允许您保留一个大小可变的值缓冲区,该值将在每个观察者订阅时发出。与记住我意识到的所有值并不完全相同,但是由于内存使用情况,这绝对不是一个好主意。可能比BehaviourSubject提供的单个值更近。

以下内容将使2个值可用于新订户:

ISubject<int> replaySubject = new ReplaySubject<int>(2);
IObservable<int> observable;

[TestMethod]
public void TestMethod()
{
     observable = replaySubject;

     replaySubject.OnNext(1);
     replaySubject.OnNext(2);
     replaySubject.OnNext(3);
     replaySubject.OnNext(4);
     replaySubject.OnNext(5);

     observable.Subscribe(OnValue);
}

输出:

观察值:4 观测值:5