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