时间:2019-05-16 标签:c#Observable subject hot andcold

Dar*_*key 3 c# system.reactive

我经常遇到这样的情况:我想要一个 UI 元素“观察”一个潜在的值——假设我正在显示一个 int——我想要一个我可以订阅的 IObservable。

我一直在下面使用一个主题,所以我可以设置它。这真的很好用……除了第一次。如果我设置了主题 - 然后稍后通过打开一个新的 UI 元素订阅它 - 它不会触发 onnext 直到下一次更改。

我基本上想要一些像主题一样工作的东西 - 但总是立即对任何新订阅者执行最新值的 onNext 。

我知道我可以自己编写这样的构造 - 但它似乎是一个常见的用例 - 是否有我遗漏的标准?

Eni*_*ity 5

你想要BehaviorSubject<T>ReplaySubject<T>

BehaviorSubject<T> 重放最近的单个值并要求您在构造函数中提供初始值。

你像这样使用它:

var bs = new BehaviorSubject<int>(0);
bs.Subscribe(x => Console.WriteLine(x));
bs.OnNext(42);
bs.Subscribe(x => Console.WriteLine(x));
Run Code Online (Sandbox Code Playgroud)

这将输出0,然后42,然后42到控制台。

ReplaySubject<T>更一般一些。它允许您指定要重播的值的数量,但不强制您提供初始值。

var rs = new ReplaySubject<int>(1);
rs.Subscribe(x => Console.WriteLine(x));
rs.OnNext(42);
rs.Subscribe(x => Console.WriteLine(x));
Run Code Online (Sandbox Code Playgroud)

这会产生42,然后42到控制台。

将此与标准Subject<T>.

var s = new Subject<int>();
s.Subscribe(x => Console.WriteLine(x));
s.OnNext(42);
s.Subscribe(x => Console.WriteLine(x));
Run Code Online (Sandbox Code Playgroud)

那只是产生42.