我的场景如下:
- 异步事件在任意时刻触发。
- 我想为一批事件触发一个昂贵的操作,例如,其中事件批次相隔 500 毫秒。因此,只要事件的间隔小于 500 毫秒 - 它们就属于同一批次。但是,如果 500 毫秒过去了而没有任何事件,那么是时候触发昂贵的操作了。
- 昂贵的操作必须只有最后一个事件的数据,所有以前的事件都可以丢弃。理想情况下,我想避免累积非恒定数量的事件,因为它是多余的。
- 如果 500 毫秒没有安静窗口,则不会触发昂贵的操作。即使需要几个小时才能出现这样的窗口。
到目前为止,我所做的是创建Subject<T>
类的全局实例,每次有事件时,我都会调用OnNext()
方法将事件推送到主题指定的可观察流。
接下来,我知道我需要在我的主题之上构建一个管道,并且该管道应该在每个批次中生成最后一个元素。这就是我要空白的地方。
如果我正确理解了您的问题,您可以使用 Throttle 运算符....
var subscription = myObservable
.Throttle(Timespan.FromSeconds(0.5))
.Subscribe(DoExpensiveOperation) ;
MSDN 文档说"忽略可观察序列中的值,这些值后跟另一个值,在指定源、到期时间和调度程序的到期时间之前。换句话说,限制只会在等待指定的时间跨度后发出事件。 但是,每次收到新事件时,等待期都会重置,因此,如果事件快速传入,则在序列结束之前不会发出任何内容。 这个网站是反应式运算符的优秀背景。 我还推荐Rx .Net HOL,它很旧,有点过时,但它以非常易读的方式涵盖了许多概念。