Будет ли BufferWithTime из Reactive Extensions вызывать OnNext частично? - PullRequest
4 голосов
/ 03 ноября 2010

Я использую BufferWithTime () из Rx для пакетной обработки сообщений. Если моему методу OnNext требуется больше времени для завершения, чем использованный интервал времени, могу ли я получить два одновременных вызова моих методов OnNext?

Другими словами, будет ли интервал времени, указанный в вызове BufferWithTime (), оцениваться в абсолютном выражении или он будет действовать как "асинхронный сон" после того, как мой метод OnNext вернется?

1 Ответ

4 голосов
/ 03 декабря 2010

Нет, звонки на OnNext будут поставлены в очередь. Приведенный ниже код записывает в трассировку по истечении времени буфера, а также начало / конец вызова OnNext для абонента (в котором он спит в 4 раза больше времени буфера):

Observable.Interval(TimeSpan.FromMilliseconds(50), Scheduler.TaskPool)
    .Take(50)
    .BufferWithTime(TimeSpan.FromMilliseconds(100))
    .Do(_ => Trace.WriteLine("Buffer elapsed"))
    .ObserveOn(Scheduler.TaskPool)
    .Subscribe(_ =>
    {
        Trace.WriteLine("Begin OnNext");
        Thread.Sleep(200);
        Trace.WriteLine("End OnNext");
    });

Вывод следующий. Вы можете видеть, что Begin / End OnNext никогда не перекрывается, даже если Buffer elapsed встречается дважды во время вызова OnNext:

Буфер истек
Начать в следующем
Буфер истек
Буфер истек
Конец OnNext
Начать в следующем
Буфер истек
Буфер истек
Буфер истек
Конец OnNext
Начать в следующем
Конец OnNext
Начать в следующем
Конец OnNext
Начать в следующем
Конец OnNext
Начать в следующем
End OnNext

...