我对可观察到的流有一些特殊的需求/要求,该流远远超出了正常的节流功能,我不确定如何做:
基本上我有一个可观察到的流,最初是从这样的正常事件中进行的:
var someEventObservable = Observable.FromEventPattern<SomeEventHandler, SomeEventArgs>(
handler => this.ColumnWidthChanged += handler,
handler => this.ColumnWidthChanged -= handler)
.Select(_ => Unit.Default);
现在,由于这些事件可以快速连续发生,而且我只需要知道它是否在给定时间范围内至少发生一次,我通常会使用.throttle(),即喜欢:
var someThrottledEventObservable = someEventObservable
.Throttle(TimeSpan.FromMilliseconds(300));
,但我的实际要求更进一步:如果在该节流时间内pan/dueTime中提出了一个事件,并且如果在第一个事件之后提出了另一个事件,但仍在该duetime之内,我希望节流流从0开始再次等待时间,再等待300ms ...如果举起另一个事件,请重新启动/延长该时间..等等,依此类推。只有在原始或重新启动的时间板/dueTime中没有提出其他事件时,someThrottledEventObservable
应产生新的单位实例。
我希望这是有道理的 - 但基本上我需要/需要一个节流的事件流,每当源流停止在给定时间&amp中产生新事件时,会产生一个事件。如果在等待时间内发生新事件,则节流流应该重新启动等待。
or:在持续的事件的"风暴"中。单独的throttle()每300ms就会产生一个新单元(在上面的示例中),但是每当发射一个或多个事件时,我都希望完全一个新单元,但没有发生新的事件此后的300ms冷却范围内。
我该怎么做?
正如@nikoniko已经提到的那样,油门会做到这一点。
using System;
using System.Reactive.Linq;
namespace Printing {
class Program {
static void Main(string[] args) {
var source = Observable.Interval(TimeSpan.FromMilliseconds(333))
.Do(i => Console.WriteLine($"new item: {i}"));
var sampling = source.Throttle(TimeSpan.FromSeconds(1))
.Do(i => Console.WriteLine($"sampled: {i}"));
var subscription = sampling.Subscribe();
Console.ReadLine();
subscription.Dispose();
Console.ReadLine();
}
}
}一无所获,因为来自源的事件以两个高频到来。但是,如果来源需要更多时间传递元素,则在油门中给出的时间板:
using System;
using System.Reactive.Linq;
namespace Printing {
class Program {
static void Main(string[] args) {
var source = Observable.Interval(TimeSpan.FromSeconds(1.2))
.Do(i => Console.WriteLine($"{DateTime.Now.ToShortTimeString()}: new item: {i}"));
var sampling = source.Throttle(TimeSpan.FromSeconds(1))
.Do(i => Console.WriteLine($"{DateTime.Now.ToShortTimeString()}: {i}"));
var subscription = sampling.Subscribe();
Console.ReadLine();
subscription.Dispose();
Console.ReadLine();
}
}
}
在节流时间结束后,结果将出现。如您所见,在源源中的事件发生后第二,它将出现在结果中。
08:32:26: new item: 0
08:32:27: throttle 0
08:32:28: new item: 1
08:32:29: throttle 1
08:32:30: new item: 2
08:32:31: throttle 2
08:32:32: new item: 3
08:32:33: throttle 3
08:32:34: new item: 4
08:32:35: throttle 4
08:32:36: new item: 5
08:32:37: throttle 5