有一种相当简单的方法可以使用EventLoopScheduler.
我从一个 observable 开始,它将每 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,然后在每次之后将其休眠 1 秒钟,OnNext以便它只能OnNext在唤醒后开始下一个。
我测试了它是否可以与以下代码一起使用:
ys
    .Timestamp()
    .Select(x => x.Timestamp.Second + (double)x.Timestamp.Millisecond/1000.0)
    .Subscribe(x => Console.WriteLine(x));
我希望这有帮助。