Нет, звонки на 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