我知道以下是一个阻塞调用,并且将以可观察的顺序返回第一个值:

var result = myObservable.First();

根据我使用的主题类型,这会有不同的含义:
  • 主题-First()将阻塞,直到下一次调用OnNext()为止,这意味着最终这将是最新值
  • BehaviorSubject-First()将阻塞,直到至少一个值已通过OnNext()推送为止,并且因为BehaviorSubject跟踪最后一个值,所以它将是最新值
  • ReplaySubject-First()将阻塞,直到已通过OnNext()推送了至少一个值,但在通过OnNext推送了许多项目的情况下,它将是其缓冲区中的第一个启动项,而不是最后一个

  • 现在,我试图找到一种一致的方法来获取最后一个值,而不管使用的是哪个基础Observable。

    有任何想法吗?

    最佳答案

    根据您的其他接收问题,我认为您需要这样做:

    var rootSubject = new ReplaySubject<Types>();
    var firstSubject = rootSubject.Where(x => x == Types.First);
    var secondSubject = rootSubject.Where(x => x == Types.Second);
    var thirdSubject = rootSubject.Where(x => x == Types.Third);
    var forthSubject = rootSubject.Where(x => x == Types.Fourth);
    
    var mergedSubject = Observable
                  .Merge(firstSubject, secondSubject, thirdSubject, forthSubject)
            .Timeout(TimeSpan.FromSeconds(2), Observable.Return(Types.Error))
            .Replay();
    
    mergedSubject.Connect();
    
    rootSubject.OnNext(Types.First);
    rootSubject.OnNext(Types.Second);
    
    var result = mergedSubject.First();
    
    rootSubject.OnNext(Types.Third);
    rootSubject.OnNext(Types.Fourth);
    
    Console.WriteLine(String.Format("result - {0}", result));
    

    现在,使用哪种主题都无所谓,它们都返回“结果-第一”。

    如果要在调用mergedSubject.First()之前获取最新值,则可以使用Replay(1):
    var mergedSubject = Observable
                    .Merge(firstSubject, secondSubject, thirdSubject, forthSubject)
                    .Timeout(TimeSpan.FromSeconds(2), Observable.Return(Types.Error))
                    .Replay(1);
    

    在这种情况下,所有主题类型都将返回“结果-第二”。

    关于c# - 活性: Latest value to be received by IObservable,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5235140/

    10-10 16:17