Rx - 开始缓冲onNext

时间:2016-06-14 10:44:07

标签: c# system.reactive reactive-programming

使用Observable.Buffer(TimeSpan timeSpan) Method,将流拆分为10分钟的块并返回IList,这样可以正常工作

var stream = Observable.FromEventPattern<*>(*,*);
stream.Buffer(TimeSpan.FromSeconds(10));

尝试实施更复杂的行为

  • 将新事件推入流 (而不是每10秒)时,启动chunk(缓冲事件列表)
  • 继续缓冲事件,直到没有任何事件被推入流中x

2 个答案:

答案 0 :(得分:0)

试试这个:

var query =
    stream.Publish(
        ps => ps.Window(
            () => ps.Delay(TimeSpan.FromSeconds(1.0)).Take(1)));

答案 1 :(得分:0)

我相信你有很多方法可以做到这一点。

我在这里有一个经过测试的例子

void Main()
{
    var scheduler = new TestScheduler();
    var stream = scheduler.CreateColdObservable(
        ReactiveTest.OnNext(1.Seconds(), 'A'),
        ReactiveTest.OnNext(2.Seconds(), 'B'),
        ReactiveTest.OnNext(13.Seconds(), 'C')
        );

    var observer = scheduler.CreateObserver<string>();

    var query = stream.Publish(s => {
        return s.Timeout(TimeSpan.FromSeconds(10), Observable.Empty<char>(), scheduler)
            .ToList()
            .Where(buffer=>buffer.Any())    
            //Project to string to make equality test easier for the example.       
            .Select(buffer=>string.Join(",", buffer))
            .Repeat();
    });

    query.Subscribe(observer);

    scheduler.AdvanceBy(100.Seconds());

    ReactiveAssert.AreElementsEqual(
        new []{
            ReactiveTest.OnNext(12.Seconds(), "A,B"),
            ReactiveTest.OnNext(23.Seconds(), "C")
        },
        observer.Messages);
}

// Define other methods and classes here
public static class TimeEx
{
    public static long Seconds(this int seconds)
    {
        return TimeSpan.FromSeconds(seconds).Ticks;
    }
}

请注意,我只是将Buffered列表设为一个字符串,以便更容易验证相等性。即"A,B"而不是{'A', 'B'}

要考虑的其他选项是执行此操作的WindowGroupJoin运算符 - 请参阅http://www.introtorx.com/content/v1.0.10621.0/17_SequencesOfCoincidence.html。我确信其他运营商可以像SwitchSelectTimerTimeout等一样拼接在一起以获得结果。