BehaviorSubject.First()已经过时,有什么替代方案?

时间:2014-02-22 22:32:07

标签: .net system.reactive

所以我有一个BehaviorSubject<string>我希望用于一个属性。我一直在使用阻止First()方法来获取BehaviorSubject在属性获取器中保存的当前值。

First()操作现已过时,那么实现此目的的新方法是什么?

2 个答案:

答案 0 :(得分:9)

詹姆斯的答案很棒,但我认为值得一提的是适用于任何IObservable的First的一般替代品。但是如果你知道它是一个BehaviorSubject,那么一定要使用Value属性。

// synchronously wait for the value
var value = someObservable.FirstAsync().Wait();

// async await
var value = await someObservable.FirstAsync();

答案 1 :(得分:6)

使用BehaviorSubject<T>,我们保证*始终可以使用First值。

但是,IObservable<T>查询运算符一般不能在该假设下工作,因此添加了Obsolete属性以引导人们使用FirstAsync之类的异步方法 - 帮助他们“堕落”进入成功的陷阱“。

由于BehaviorSubject<T>始终具有值集的特殊情况,因此它具有线程安全Value属性。所以,假设你有这样的东西:

var subject = new BehaviorSubject<string>("Some value");

然后你可以这样做:

var current = subject.Value;

* 尝试在调用BehaviorSubject<T>方法之后访问Dispose实例的值,无论是Value属性还是FirstAsync之类的查询运算符},会导致ObjectDisposedException被抛出。