System.Reactive.Subjects里的Subject实现了观察者和被观察者的接口。
可以使用OnNext(T val)发布通知;
可以通过SubScribe(new Action<T>(function))可以订阅该数据T.
例子:
//定义
private Subject<int> mAlarmRedCount = new Subject<int>();
public IObservable<int> AlarmRedCount => mAlarmRedCount;
//发布
mAlarmRedCount.OnNext(intval);
//订阅
xxxViewModel.AlarmRedCount.Subscribe(new Action<int>(func));
//也可以
public Subject<int> mAlarmRedCount = new Subject<int>();
//发布
mAlarmRedCount.OnNext(intval);
//订阅
xxxViewModel.mAlarmRedCount.Subscribe(new Action<int>(func));
//func定义具体的操作
重播主题<T>
ReplaySubject<T> 缓存这些值并为迟到的订阅者重播它们。
缓存大小限制为 1。请注意我们如何使用ReplaySubject<T>的构造函数重载将 Cache 的大小提供为 1 。这限制了缓存并确保仅缓存一个元素,并且一旦发布就会被新元素替换。
var subject = new ReplaySubject<int>(1);
subject.OnNext(1);
subject.OnNext(2);
subject.Subscribe(Console.Write);
subject.OnNext(3);
subject.OnNext(4);
BehaviorSubject<T> 仅缓存最后发布的值
var subject = new BehaviorSubject<int>(0);
第一个是默认值的存在。请注意,在上面的代码中,我们 在BehaviorSubject<T>的构造函数中提供了一个值0 作为默认值 。如果缓存中没有值(或者换句话说,在观察者订阅之前没有发布数据),那么将返回默认值。这 与大小为 1 的ReplaySubject<T>不同 ,后者没有任何值。
第二个区别是 BehaviorSubject<T> 和 ReplaySubject<T> 在订阅已完成序列时的行为方式。BehaviorSubject<T>在 完成后订阅时不会有任何值,
异步主题<T>
AsyncSubject<T>仅当序列被标记为完成时, AsyncSubject<T> 才会发布最后一个缓存的值(它只缓存一个值,即最后一个)。
Merge
Merges elements from two observable sequences into a single observable sequence
xx.mAlarmRedCount.Merge(xx.mAlarmLightCount).Subscribe(new Action<int>(func));
两个数据源OnNext的时候,订阅方都进入同一个func
Throttle 节流阀实现:连续的多次调用,在每个时间段的周期内只执行第一次处理过程。
_redrawSubject.Throttle(TimeSpan.FromMilliseconds(50)).Subscribe(it => _redrawEvent.Set());