通常,当您订阅值的更改时,您也有兴趣了解初始值。我希望我的IObservable缓存最新(或初始)值并在订阅时推送该值。
使用普通事件时,我常常会得到类似
的代码x.SomeEvent += SomeEventHandler;
SomeEventHandler(x, EventArgs.Empty);
使用IObservable我希望用推送初始值的东西包装事件。如果我有多个订阅者,他们应该在订阅时收到最新的价值 我有一些代码,如果我在创建IObservable之后立即订阅,但如果事件在订阅之前触发则没有:
class Program
{
static void Main()
{
var s = new Source { Value = 1 };
var values = Observable.Return(s.Value).Concat(
Observable.FromEvent(
h => s.ValueChanged += h,
h => s.ValueChanged -= h)
.Select(_ => s.Value));
using (values.Subscribe(Console.WriteLine))
{
s.Value = 2; // prints 1,2 as expected
}
using (values.Subscribe(Console.WriteLine))
{
s.Value = 3; // prints 1,3 - expected 2,3
}
}
}
class Source
{
private int _value;
public int Value
{
get { return _value; }
set
{
if (_value == value)
return;
_value = value;
if (ValueChanged != null)
ValueChanged(this, EventArgs.Empty);
}
}
public event EventHandler ValueChanged;
}
如何创建按预期工作的IObservable?
答案 0 :(得分:6)
解决方案是将BehaviorSubject
订阅到observable,并将所有观察者订阅到BehaviorSubject
。 BehaviorSubject
将记住上次通知,并在订阅时通知新观察者。
查看具有Observable.Publish
参数的initialValue
扩展方法。这会创建一个内部使用IConnectableObservable
的{{1}}。
BehaviorSubject
(未测试的)