微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – Throttle Rx.Observable不跳过值

节流方法从可观测序列中跳过值,如果其他参数跟随太快.但是我需要一种方法来延迟它们.也就是说,我需要在项目之间设置一个最小的延迟,而不会跳过任何事情.

实际示例:有一个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));

我希望这有帮助.

原文地址:https://www.jb51.cc/csharp/95690.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐