我对某个可观察流的特殊需求/要求有点超出正常的限制,我不完全确定如何做到这一点:
基本上我有一个可观察的Stream,最初来自正常事件,如:
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));
但是我的实际要求更进了一步:如果在该限制TimeSpan / dueTime内引发了一个事件,并且如果在第一个事件之后引发了另一个事件但仍然在该dueTime内,我希望受限制的流从0开始再等一下,等待另一个300ms ...如果另一个事件被提出,重新开始/延长那个时间......依此类推等等。
只有在原始或重新启动的TimeSpan / dueTime中没有引发其他事件时,someThrottledEventObservable
才会产生新的Unit实例。
我希望这是有道理的 - 但基本上我希望/需要一个受限制的事件流,只要源流停止在给定时间内产生新事件,就会产生一个事件。如果在该等待时间内发生新事件,则受限制的流应该重新开始等待。
或者:正在进行的风暴&#39;事件.Throttle()单独产生一个新的单位每300毫秒(在上面的例子中)但我想要一个或多个事件被触发时只有一个新的单位,但此后300毫秒的冷却期内没有新的事件发生。 / p>
我该怎么做?
答案 0 :(得分:0)
正如@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