c# - 如何在长时间运行的查询中扩展 Throttle Timespan?

标签 c# system.reactive reactive-programming

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

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

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

最佳答案

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

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

如果您输入 2, throttle 将变为两秒 throttle ,所有事件都将被抑制。向下更改为 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 的参数, durationSelectorGroupByUntil , bufferClosingSelectorBuffer .

关于c# - 如何在长时间运行的查询中扩展 Throttle Timespan?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19499469/

相关文章:

c# - 将 LINQ 语句从查询转换为流利的 c# 语法

c# - 在使用 FromEventPattern 订阅之前捕获事件

c# - Xamarin Forms/ReactiveUI Router-在关闭 subview 后显示 subview 并执行父ViewModel代码

java - 使用 ReactiveCouchbaseRepository 时出现 IllegalArgumentException 期望找到类 rxSingle 的响应式(Reactive)适配器,但无法找到

c# - 可以将 F# 类型的提供程序合并到 C# 中吗

c# - 如何在不实例化对象或没有静态方法的情况下获取类的名称?

c# - 为什么 IEnumerable.ToObservable 这么慢?

javascript - 在 RxJS 中制作打字计时器;跟踪打字时间

c# - Properties 如何可以有 Properties 和 Methods?

c# - 如何将任务列表转换为 Observable 并在完成时处理元素?