簡體   English   中英

Rx.Net使用Observable.Create代替Subject

[英]Rx.Net Using Observable.Create instead of Subject

我有使用主題創建可觀察對象的代碼。 我可以使用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。

假設您不需要直接調用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM