BufferWithTime行为不一致

时间:2011-03-10 12:12:33

标签: unit-testing system.reactive

我有一个测试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]

我的问题是,为什么第一个缓冲区中只有两个项目而第二个缓冲区中只有4个项目?我希望发生一个与缓冲同时发生的源,它们要么总是进入缓冲区,要么总是排队等待下一个缓冲区。我偶然发现了一个错误吗?

1 个答案:

答案 0 :(得分:1)

根据MSDN论坛上的回复,这不是错误。您可以阅读他们的答案here

基本上,当某些东西被安排在与其他东西完全相同的时间执行时,它就是优先级的调度顺序,即它们排队。通过上面的例子查看调度的顺序时,您可以看到我为什么会得到我正在获得的行为。

  1. BufferWithTime安排一个窗口 开盘价为0,收盘价为150。
  2. 然后订阅冷源 时间表全部其他 通知。此时,值为 然后将在150处发出的排在后面 关闭窗户。
  3. 在时间150,窗口首先关闭 (发出两个第一个缓冲区 值)。下一个窗口打开 并计划在300关闭。 计划的值 在150处发射的是加到 第二个缓冲区。
  4. 在时间300,值6是 计划首先发射(因为它 安排来源时 订阅)所以它被添加到 第二缓冲区。然后,BufferWithTime关闭窗口(发出缓冲区)并打开一个计划在450关闭的新窗口。
  5. 然后,他们将继续循环。