使用Reactive Extensions(RX),是否可以将.Buffer时间移回10秒?

时间:2014-10-07 10:17:17

标签: .net visual-studio-2012 .net-4.5 system.reactive

我使用Buffer收集一分钟内的所有事件,并将它们显示在列表中:

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中是否可行?

2 个答案:

答案 0 :(得分:3)

是。关键的洞察力是时间可以表示为Observable。因此,使用Buffer的重载接受一个observable作为边界信号,并使用Observable.Timer将其传递给您自己的信号:

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

答案 1 :(得分:2)

您需要创建一个流来定义所需的缓冲区边界。幸运的是,这很容易。以下将定义10秒的初始缓冲区间隔,然后是后续的一分钟间隔:

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

然后假设您可以执行xs的源流:

var bufferedEvents = xs.Buffer(bufferBoundaries);