使用Observable.FromEventPattern在不活动或计数后执行操作

时间:2015-09-02 18:58:48

标签: c# system.reactive

我有一个可观察的流,它是根据如下所示的事件模式创建的。

var keyspaceStream = Observable.FromEventPattern<RedisSubscriptionReceivedEventArgs>(
            h => keyspaceMonitor.KeySpaceChanged += h,
            h => keyspaceMonitor.KeySpaceChanged -= h);

我想要做的是订阅流并在有10秒不活动(没有发生任何事件)或在没有执行方法的情况下触发100个事件时执行方法。这是为了避免每隔5秒触发事件并且从不调用onNext方法的情况。

我怎样才能做到这一点?我知道如何做第一部分(见下文),但我无法弄清楚如何进行计数逻辑。请注意,我已经知道如何订阅流。

var throttledStream = keyspaceStream.Throttle(TimeSpan.FromSeconds(10));

任何帮助将不胜感激!谢谢。

1 个答案:

答案 0 :(得分:4)

bufferClosingSelector与自定义maxDuration一起使用。这里的想法是每个缓冲区应该在maxCount之后或var maxDuration = TimeSpan.FromSeconds(10); var maxCount = 100; var throttledStream = keyspaceStream.Publish(o => { var reachedMaxDuration = o .Select(_ => Observable.Timer(maxDuration, scheduler)) .Switch(); return o.Buffer(() => o .TakeUntil(reachedMaxDuration) .Take(maxCount) .LastOrDefaultAsync()); }); 之后关闭,以较早者为准。每次缓冲关闭时,都会打开一个新缓冲区。

IScheduler scheduler

我假设您提供throttledStreamIObservable<IList<EventPattern<RedisSubscriptionReceivedEventArgs>>>的类型为['a','b']