2014-10-07 49 views
2

我使用Buffer收集在一分钟内的所有事件,并且将其呈现到一个列表:使用无功扩展(RX),是否可以将缓冲时间移回10秒?

this.GetServiceAvailablityRxStream     
    .Buffer(TimeSpan.FromMinutes(1)) 
    .Subscribe(
     serviceAvailableList => 
     { 
      ... 
     } 

目前,它缓冲在T = 1分钟,则T = 2分钟,等等

我想知道是否有可能将缓冲恢复10秒,例如使其缓冲在T = 10秒,则T = 1分钟+ 10秒,则T = 2分钟+ 10秒,等等

什么我试图

我已经尝试了所有的组合.Delay,.DelaySubscription,过载.Buffer,把.Delay之前和之后的.Buffer命令,等等,似乎没有任何工作。

我想知道这是否可能在RX?

回答

3

是。关键的洞察力是时间可以表示为可观察的事实。因此,使用的Buffer超载接受可观察到的边界信号并使用Observable.Timer通过它自己的信号:

var first = TimeSpan.FromSeconds(10); 
var remainder = TimeSpan.FromMinutes(1); 
var boundaries = Observable.Timer(first, remainder); 
source.Buffer(boundaries).Subscribe(...); 
+0

我已经忘记了定时器的是超载! +1 – 2014-10-07 13:08:17

+0

@JamesWorld确实,有太多的操作符变化来记住它们! – Brandon 2014-10-08 12:35:09

2

您需要创建一个流来定义所需的缓冲区边界。幸运的是,这很容易。下面将定义的10个第二初始缓冲时间间隔,随后通过后续的一分钟的间隔:

var bufferBoundaries = 
    Observable.Timer(TimeSpan.FromSeconds(10), TimeSpan.FromMinutes(1)); 

然后假设xs源流可以这样做:

var bufferedEvents = xs.Buffer(bufferBoundaries);