Reactive Throttle返回TimeSpan中添加的所有项目

时间:2012-01-13 11:24:39

标签: c# system.reactive

鉴于IObservable<T>有一种方法可以使用Throttle行为(在添加项目时重置计时器,但让它返回在该时间内添加的所有项目的集合?

Buffer提供了类似的功能,它会在每个时间跨度或计数时将数据分块为IList<T>。但每次添加项目时我都需要重置时间。

我在这里看到了类似的问题,Does reactive extensions support rolling buffers?,但答案看起来并不理想,而且有点旧,所以我想知道Rx-Main的发布版本现在是否支持这个功能。

3 个答案:

答案 0 :(得分:9)

正如我answered in the other post,是的,你可以!使用Throttle的{​​{1}}和Window方法:

Observable

答案 1 :(得分:2)

我通过添加一个 Publish 组件修改了 Colonel Panic 的 BufferUntilInactive 操作符,以便它也能正确处理冷观察:

/// <summary>Projects each element of an observable sequence into consecutive
/// non-overlapping buffers, which are produced based on time and activity.</summary>
public static IObservable<IList<T>> BufferUntilInactive<T>(
    this IObservable<T> source, TimeSpan dueTime)
{
    return source.Publish(published =>
        published
            .Window(() => published.Throttle(dueTime))
            .SelectMany(window => window.ToList())
    );
}

答案 2 :(得分:0)