'Sliding' RX.net .油门() 窗口



我对可观察到的流有一些特殊的需求/要求,该流远远超出了正常的节流功能,我不确定如何做:

基本上我有一个可观察到的流,最初是从这样的正常事件中进行的:

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

相关内容

  • 没有找到相关文章

最新更新