加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 平滑Rx Observables

发布时间:2020-12-15 22:06:58 所属栏目:百科 来源:网络整理
导读:非常类似于这个问题: Rx IObservable buffering to smooth out bursts of events,我有兴趣平滑可能在爆发中发生的可观察量. 希望下面的图表说明我的目标是: Raw: A--B--CDE-F--------------G-----------------------Interval: o--o--o--o--o--o--o--o--o--
非常类似于这个问题: Rx IObservable buffering to smooth out bursts of events,我有兴趣平滑可能在爆发中发生的可观察量.

希望下面的图表说明我的目标是:

Raw:       A--B--CDE-F--------------G-----------------------
Interval:  o--o--o--o--o--o--o--o--o--o--o--o--o--o--o--o--o
Output:    A--B--C--D--E--F-----------G---------------------

鉴于原始流,我希望定期延长这些事件.

限制不起作用,因此我最终失去了原始序列的元素.

如果原始流比计时器更频繁,则Zip工作良好,但如果存在没有原始事件的时段,则Zip失败.

编辑

在回应Dan’s answer时,Buffer的问题在于,如果很多事件的突发在很短的时间间隔内到达,那么我经常收到事件.下面显示了缓冲区大小为3时可能发生的情况,以及配置为所需时间间隔的超时:

Raw:       -ABC-DEF-----------G-H-------------------------------
Interval:  o--------o--------o--------o--------o--------o--------
Buffered:  ---A---D-------------------G--------------------------
              B   E                   H
              C   F
Desired:   ---------A--------B--------C--------D--------E ..etc.

解决方法

这个怎么样? (灵感来自 James’ answer mentioned in the comments)……

public static IObservable<T> Regulate<T>(this IObservable<T> source,TimeSpan period)
{
    var interval = Observable.Interval(period).Publish().RefCount();

    return source.Select(x => Observable.Return(x)
                                        .CombineLatest(interval,(v,_) => v)
                                        .Take(1))
                 .Concat();
}

它将原始observable中的每个值转换为自己的可观察值. CombineLatest意味着在间隔之前它不会产生值.然后我们从这些可观察的每个中取一个值并连接起来.

原始可观察量中的第一个值延迟一个周期.我不确定这是否是一个问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读