是否可以在查询中间扩展 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
的参数, durationSelector
在GroupByUntil
, bufferClosingSelector
在Buffer
.
关于c# - 如何在长时间运行的查询中扩展 Throttle Timespan?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19499469/