如何在长时间运行的查询中延长限制时间跨度?

2023-11-29

是否可以在查询中间延长 Throttle Timespan 值?例如,假设一个例子101 Rx 样本节流有这个查询var throttled = observable.Throttle(TimeSpan.FromMilliseconds(750));.

如果我想更改它,以便在前 500 毫秒内不会发生任何事件,那么限制值将扩展到例如此后每个事件的 1500 毫秒。

这是一个使用Switch操作员?


存在超载Throttle接受一个工厂函数,该函数获取源事件并生成一个“节流流”,该流是IObservable<T>(T 可以是任何类型)。事件将被抑制,直到节流流发出。

以下示例有一个每秒泵送一次的流,其中节流工厂产生 0.5 秒的节流。因此,在启动时,源流不会受到限制。

如果您输入 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 中使用的一种非常常见的技术,非常值得您思考:类似用途的示例包括other论证TakeUntil, the durationSelector in GroupByUntil, the bufferClosingSelector in Buffer.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在长时间运行的查询中延长限制时间跨度? 的相关文章

随机推荐