2013-10-21 240 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