有一种相当简单的方法可以使用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));
我希望这有帮助。