2011-03-10 51 views
1

我有一個單元測試,測試BufferWithTime。我似乎得到不一致的結果,當值在該點的緩衝會發出新的價值被髮射。不一致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個在第二?我預計它發射的緩衝是應該發生的同一時間源,他們要麼總是在緩衝區或總是排隊等待下一個緩衝區。我剛剛偶然發現了一個錯誤?

+0

聽起來像它可能涉及到的方式TestScheduler時間表「立即」行動,爲1蜱未來的行動。可能要問在論壇上 - http://social.msdn.microsoft.com/Forums/en-US/rx/threads – 2011-03-10 15:08:09

回答

1

基於在MSDN論壇上的反應,這是不是一個錯誤。你可以閱讀他們的答案here

基本上,當一些被安排在完全相同的時間,別的東西來執行,它的調度是優先即它們排隊的順序。當在上面的示例調度的排序看,你就會明白爲什麼我得到的是我得到的行爲。

  1. BufferWithTime安排一個窗口 在0打開和關閉150
  2. 冷源,然後訂閱 到時間表所有其他 通知。在這一點上,該值是在 150發出然後後面 排隊的窗口的關閉。
  3. 在時間150在窗口關閉第一 (發光2個 值的第一緩衝液)。下一個窗口被打開 並定收於300 被調度爲在150發射 加到 第二緩衝器的值。
  4. 在時間300時,值6是 調度以第一發射(因爲它 定當訂閱源是 ),所以它被添加到 第二緩衝器中。然後BufferWithTime關閉窗口(發出緩衝區),並打開一個新的預定在450關閉。

然後他們的循環將繼續保持一致。