Непоследовательное поведение BufferWithTime - PullRequest
1 голос
/ 10 марта 2011

У меня есть модульный тест, который тестирует BufferWithTime. Кажется, я получаю противоречивые результаты, когда значения передаются в тот момент, когда буферизация выдаст новое значение.

var scheduler = new TestScheduler();

var source = scheduler.CreateColdObservable(
    new Recorded<Notification<int>>(50, new Notification<int>.OnNext(1)),
    new Recorded<Notification<int>>(100, new Notification<int>.OnNext(2)),
    new Recorded<Notification<int>>(150, new Notification<int>.OnNext(3)),
    new Recorded<Notification<int>>(200, new Notification<int>.OnNext(4)),
    new Recorded<Notification<int>>(250, new Notification<int>.OnNext(5)),
    new Recorded<Notification<int>>(300, new Notification<int>.OnNext(6)),
    new Recorded<Notification<int>>(350, new Notification<int>.OnNext(7)),
    new Recorded<Notification<int>>(400, new Notification<int>.OnNext(8)),
    new Recorded<Notification<int>>(450, new Notification<int>.OnNext(9)),
    new Recorded<Notification<int>>(450, new Notification<int>.OnCompleted()));

var results = scheduler.Run(() => source
    .BufferWithTime(TimeSpan.FromTicks(150), scheduler));

Результаты, которые я получил от этого, по сути:

results[0] = [1,2]
results[1] = [3,4,5,6]
results[2] = [7,8,9]

Мой вопрос: почему в первом буфере только два элемента, а во втором - четыре? Я ожидал бы, что источник, который испускается в то же время, что и буферизация, должен произойти, он либо всегда помещается в буфер, либо всегда ставится в очередь для следующего буфера. Я только что наткнулся на ошибку?

1 Ответ

1 голос
/ 11 марта 2011

Судя по ответам на форумах MSDN, это не ошибка.Вы можете прочитать их ответы здесь .

По сути, когда что-то запланировано выполнить точно так же, как и что-то другое, приоритет имеет порядок планирования, т.е. они находятся в очереди.Глядя на порядок планирования в приведенном выше примере, вы можете понять, почему я получаю поведение, которое я получаю.

  1. BufferWithTime планирует открытие окна в 0 и закрытие в 150.
  2. Затем подписывается холодный источник, для которого все другие уведомления.В этот момент значение, которое должно быть выдано на этапе 150, помещается в очередь за закрытием окна.
  3. Во время 150 окно закрывается первым (испускает первый буфер из двух значений).Следующее окно открывается и его закрытие запланировано на 300. Значение, которое запланировано для выброса на 150, добавляется во второй буфер.
  4. В момент 300, значение 6 было запланировано на первую передачу (как было запланировано, когда источник был подписан), так что он добавляется во второй буфер.Затем BufferWithTime закрывает окно (создает буфер) и открывает новое, запланированное к закрытию на 450.

Затем цикл будет продолжаться последовательно.

...