【问题标题】:Inconsistent BufferWithTime BehaviorBufferWithTime 行为不一致
【发布时间】:2011-03-11 18:49:19
【问题描述】:

我有一个测试 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 个?我希望一个与缓冲同时发射的源应该发生,它们要么总是进入缓冲区,要么总是排队等待下一个缓冲区。我是不是偶然发现了一个错误?

【问题讨论】:

标签: unit-testing system.reactive


【解决方案1】:

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

基本上,当某事被安排在与其他某事完全相同的时间执行时,优先考虑的是调度顺序,即它们被排队。通过上面的示例查看调度的顺序时,您可以了解为什么我会得到我正在得到的行为。

  1. BufferWithTime 安排一个窗口 0 点开,150 点收盘。
  2. 然后订阅冷源 所有其他 通知。此时,值为 在 150 发出的然后排在后面 关闭窗口。
  3. 在时间 150 窗口首先关闭 (发出两个的第一个缓冲区 值)。下一个窗口打开 并计划于300收盘。 计划为的值 在 150 发射的被添加到 第二个缓冲区。
  4. 在时间 300,值 6 是 计划首先发出(因为它 是在源出现时安排的 订阅)所以它被添加到 第二个缓冲区。 BufferWithTime 然后关闭窗口(发射缓冲区)并打开一个计划在 450 关闭的新窗口。

然后它们的循环将持续不断。

【讨论】:

    猜你喜欢
    • 2015-11-17
    • 2015-08-05
    • 2020-12-21
    • 2013-12-17
    • 2018-08-27
    • 2016-01-13
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多