节流方法从可观测序列中跳过值,如果其他参数跟随太快.但是我需要一种方法来延迟它们.也就是说,我需要在项目之间设置一个最小的延迟,而不会跳过任何事情.
实际示例:有一个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));
我希望这有帮助.