c# - 如何让事件至少间隔一个给定的时间跨度?

标签 c# system.reactive

我希望输出序列的事件尽快发生,但不在从最近事件开始的 N 秒窗口内发生。

这是一个大理石图,假设我想在事件之间至少分隔三个破折号:

Input:  a-------b-cd-----e---------f-----g-h
Result: a-------b---c---d---e------f-----g---h

签名为:

IObservable<T> Separate<T>(this IObservable<T> source, TimeSpan separation);

最佳答案

严重依赖@ibebbs 的回答,我已经使用测试来查看是否有更简单的方法。

就在我编写代码之前,我看到了一些已编码到测试中的假设。但是,我不知道是否需要这些断言。特别是 OnCompleted 时间。 @ibebbs 断言 OnCompleted 应该出现在与最后一个值相同的帧中。 OP 没有提出这样的要求。

如果这不是必需的,那么您可以采用完全不同的方法。

当我看到你的大理石图时,我从输入到结果的心理翻译如下

Input:  a-------b-cd-----e---------f-----g-h
        a---|
                b--|
                    c--|
                        d--|
                            e--|
Result: a-------b---c---d---e------f-----g---h

即每个值都被投影到一个新的具有长尾的单值序列。也就是说,直到给定的缓冲时间,它才会完成。这使得代码就像从单个值到具有单个值和延迟完成的序列的投影一样简单。然后你只需将所有这些迷你序列连接在一起

public static IObservable<T> Separate<T>(this IObservable<T> source, TimeSpan separation, IScheduler scheduler)
{
    var delayedEmpty = Observable.Empty<T>().Delay(separation, scheduler);
    return source.Select(s=>
            Observable.Return(s).Concat(delayedEmpty)
        ).Concat();
}

这将解决 OP,但是您也会在完成序列时获得与为每个值获得的相同的缓冲区。

关于c# - 如何让事件至少间隔一个给定的时间跨度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40235683/

相关文章:

c# - WPF 页面调整大小

c# - 响应式框架消除了 Observable.Create 中的 while 循环

c# - 如何以编程方式配置 IIS 中安装的网站的 web.config?

c# - #pragma warning 禁用代码列表及其含义

c# - Motorola/Zebra 移动数据终端 MC67 条码扫描与 Xamarin EMDK

wcf - 使用 Rx 调用 WCF 服务方法 Async 导致闭包问题

c# - 如何对 Observable.Sample() 进行单元测试?

c# - 对 IEnumerable<T> 的可观察流进行分区,并在 Reactive Extensions 中延迟

c# - 从 Observable.Interval 获取,直到另一个 observable 产生一个值

c# - Xamarin 异步方法使用 OnStart()