BehaviorSubject.First()已过时,有什么替代品?

3

我有一个BehaviorSubject<string>,我希望用它作为一个属性。我一直在使用阻塞的First()方法来获取BehaviorSubject在属性getter中保存的当前值。

First()操作现在已经过时了,那么有什么新方法可以实现这个功能呢?


你能分享一下警告的文本吗? - Colonel Panic
2个回答

9

詹姆斯的回答很好,但我认为值得提及的是适用于任何IObservable的一般替代方案,但如果您知道它是BehaviorSubject,请绝对使用Value属性。

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

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

这实际上是我追求的,因为我公开了一个 IObservable,但从技术上讲,其他回答更适用于这个问题,所以我点赞了这个回答,并将另一个回答标记为正确。 - Cheetah
1
BehaviorSubject 有点烦人,因为你不能暴露 Value 而不暴露完整的 BehaviorSubject。如果有一个扩展了 IObservable 的 .Value 属性的 IBehaviorObservable 就好了。 - Frank Schwieterman

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 异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接