Обычно, когда вы подписываетесь на изменения значения, вам также интересно знать начальное значение. Я хочу, чтобы мой 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, который работает должным образом?