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
,將durationSelector
在GroupByUntil
, bufferClosingSelector
於Buffer
。
嗯,我怎麼沒看到那個工廠的功能..?爲了記錄,我從功能角度考慮了這個例子,作爲狀態的變化,這可能是棘手的。那麼,事實證明,這比我想象的要容易。我會看看這些。這可能甚至簡化了你非常有幫助地提供示例代碼的報警示例。再次歡呼! – Veksi