C# Subject System.Reactive.Subjects 及节流阀实现

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());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值