【问题标题】:How to extend Throttle Timespan in middle of a long running query?如何在长时间运行的查询中延长油门时间跨度?
【发布时间】:2013-10-21 16:07:15
【问题描述】:

是否可以在查询中间扩展 Throttle Timespan 值?例如,假设101 Rx Samples Throttle 中的示例有此查询var throttled = observable.Throttle(TimeSpan.FromMilliseconds(750));

如果我想改变它,如果在前 500 毫秒内没有事件,那么节流值将扩展到,例如,之后每个事件的 1500 毫秒。

这是使用Switch 运算符的地方吗?

【问题讨论】:

    标签: c# system.reactive reactive-programming


    【解决方案1】:

    有一个Throttle 的重载,它接受一个工厂函数,该函数接受源事件并产生一个IObservable<T> 的“节流流”(T 可以是任何类型)。事件将被抑制,直到油门流发出。

    以下示例具有每秒泵送的流,节流阀工厂生产 0.5 秒的节流阀。因此,在开始时,源流不会受到限制。

    如果您输入 2,油门将变为 2 秒油门,所有事件都将被抑制。更改为 1,事件将再次出现。

    void Main()
    {
        var throttleDuration = TimeSpan.FromSeconds(0.5);
        Func<long, IObservable<long>> throttleFactory =
            _ => Observable.Timer(throttleDuration);
    
        var sequence = Observable.Interval(TimeSpan.FromSeconds(1))
                                 .Throttle(throttleFactory);
    
        var subscription = sequence.Subscribe(Console.WriteLine);
    
        string input = null;
        Console.WriteLine("Enter throttle duration in seconds or q to quit");
        while(input != "q")
        {       
            input = Console.ReadLine().Trim().ToLowerInvariant();
            double duration;
    
            if(input == "q") break;
            if(!double.TryParse(input, out duration))
            {
                Console.WriteLine("Eh?");
                continue;
            }
            throttleDuration = TimeSpan.FromSeconds(duration);
        }
    
        subscription.Dispose();
        Console.WriteLine("Done");
    }
    

    因为这是为每个事件生成节流阀的工厂函数,所以您可以创建更加动态的东西,根据特定的输入事件返回节流阀流。

    像这样将流用作控件的想法是整个 Rx API 中使用的一种非常常见的技术,非常值得您仔细研究一下:类似用途的示例包括 TakeUntilother 参数,@ GroupByUntil 中的 987654326@,Buffer 中的 bufferClosingSelector

    【讨论】:

    • 嗯,我怎么没看到那个工厂函数..?作为记录,我开始从功能的角度怀疑这个例子是状态的变化,这可能很棘手。好吧,事实证明它比我想象的要容易。我会看看这些。它甚至可以简化您提供的示例代码的警报示例。再次干杯!
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多