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

我希望这有帮助.

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...