2013-10-21 148 views
2

是否有可能在查询的中间延长Throttle Timespan值?例如,假设如101 Rx Samples Throttle中的示例,存在该查询var throttled = observable.Throttle(TimeSpan.FromMilliseconds(750));如何在长时间运行的查询中延长Throttle Timespan?

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

这是一个可以使用Switch运算符的地方吗?

回答

6

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

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

如果输入say,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,将durationSelectorGroupByUntilbufferClosingSelectorBuffer

+0

嗯,我怎么没看到那个工厂的功能..?为了记录,我从功能角度考虑了这个例子,作为状态的变化,这可能是棘手的。那么,事实证明,这比我想象的要容易。我会看看这些。这可能甚至简化了你非常有帮助地提供示例代码的报警示例。再次欢呼! – Veksi