Вы можете использовать BehaviorSubject , чтобы позволить вам превратить свойство как в наблюдаемый поток, так и в свойство, из которого вы можете просто прочитать последнее значение.
public class Foo
{
private readonly BehaviorSubject<int> _fooSubject = new BehaviorSubject<int>(0);
public int FooState
{
get => _fooSubject.Value;
set => _fooSubject.OnNext(value);
}
public IObservable<int> ObservableFooState => _fooSubject;
}
Если значение FooState часто меняется, то, возможно, вы захотите использовать оператор Sample до подписки. Э.Г.
//print out value every two seconds
foo.ObservableFooState
.Sample(TimeSpan.FromSeconds(2))
.Subscribe(Console.WriteLine);
Обратите внимание, что распространенной ошибкой является использование Throttle и затем удивление, почему вы вряд ли когда-либо получите какие-либо события! (Причина в том, что Throttle сбрасывает время ожидания каждый раз, когда приходит новое событие, поэтому, когда поток часто обновляется, вы никогда не превысите значение времени ожидания.)
Хотя оно старое и немного устарело, я считаю это руководство очень полезным при изучении Reactive. Rx HOL еще старше и даже более устаревший, но все же очень полезное концептуальное введение - просто не берите примеры кода слишком буквально.
Если этот класс на самом деле является ViewModel, вы можете рассмотреть ReactiveUI , но я бы посоветовал отойти от этого, пока вы не освоитесь с Reactive.
Обратите внимание, что я не показывал логику Dispose / Completion выше. Вы должны учитывать, когда (если когда-либо) вы хотите вызвать OnCompleted для _fooSubject. Также имейте в виду, что подписки являются одноразовыми , и вы, вероятно, захотите обеспечить их удаление, когда ваши подписчики выйдут за рамки.