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

c# – Throttle Rx.Observable不跳过值

发布时间:2020-12-15 06:24:43 所属栏目:百科 来源:网络整理
导读:节流方法从可观测序列中跳过值,如果其他参数跟随太快.但是我需要一种方法来延迟它们.也就是说,我需要在项目之间设置一个最小的延迟,而不会跳过任何事情. 实际示例:有一个Web服务可以接受请求,速度不能超过一秒;有一个用户可以单独或批量添加请求.没有Rx,我
节流方法从可观测序列中跳过值,如果其他参数跟随太快.但是我需要一种方法来延迟它们.也就是说,我需要在项目之间设置一个最小的延迟,而不会跳过任何事情.

实际示例:有一个Web服务可以接受请求,速度不能超过一秒;有一个用户可以单独或批量添加请求.没有Rx,我将创建一个列表和一个计时器.当用户添加请求时,我将其添加到列表中.在定时器事件中,我将检查该列表是否为空.如果没有,我会发送请求并删除相应的项目.有锁和所有的东西.现在,使用Rx,我可以创建主题,在用户添加请求时添加项.但是,我需要一种方法来确保Web服务不会因为延迟而被淹没.

我是新来的,所以也许我错过了一些明显的东西.

解决方法

使用EventLoopScheduler来做一些相当简单的方法.

我从一个可观察的开始,将每0到3秒随机产生一次值.

var rnd = new Random();

var xs =
    Observable
        .Generate(
            0,x => x < 20,x => x + 1,x => x,x => TimeSpan.FromSeconds(rnd.NextDouble() * 3.0));

现在,要立即使这个输出值,除非最后一个值在一秒之内,我做到了这一点:

var ys =
    Observable.Create<int>(o =>
    {
        var els = new EventLoopScheduler();
        return xs
            .ObserveOn(els)
            .Do(x => els.Schedule(() => Thread.Sleep(1000)))
            .Subscribe(o);
    });

这有效地观察了EventLoopScheduler上的源,然后在每个OnNext之后将其置于睡眠状态1秒钟,以便它在唤醒后才能开始下一个OnNext.

我测试了它与这段代码一起工作:

ys
    .Timestamp()
    .Select(x => x.Timestamp.Second + (double)x.Timestamp.Millisecond/1000.0)
    .Subscribe(x => Console.WriteLine(x));

我希望这有帮助.

(编辑:李大同)

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

    推荐文章
      热点阅读