2015-09-23 69 views
1

我有一個解決方案,用於接收Observable通知,直到指定計數到達時間閾值已過。另外,我需要知道發生了哪一個。Rx.NET:直到指定的計數或定時器過去

知道是否有一個更簡單的方法(可能比其他0​​)來實現這一功能

_values. 
.GroupByUntil(_ => true, 
       i => Observable.Timer(Threshold, _scheduler) 
          .Amb(i.Buffer(SpecifiedCount).Select(_ => SpecifiedCount))) 
// this is for figuring out which one happened: interval elapsed or count filled 
.SelectMany(g => g.Count()) 
// Let's say if count filled first, call Foo() 
.Where(i => i == SpecifiedCount) 
.Subscribe(_ => Foo()) 
+0

「緩衝區」和「窗口」均接受計數或時間跨度,或兩者兼有。你有嘗試過嗎? –

+0

我現在有了,它們的功能與「GroupByUntil」解決方案有所不同。試圖找出原因。 – supertopi

+0

你想要什麼功能?有什麼不同嗎? –

回答

3

您是否在尋找Observable.Buffer Method (IObservable, TimeSpan, Int32)?根據文檔

指示可觀察序列的每個元素放入一個緩衝區,當它已滿或已經過去了給定時間量時,緩衝區會發送出去。

你應該能夠編寫:

var myObservable=_values.Buffer(Threshold,SpecifiedCount); 

有用於Window類似的過載爲好。

+0

謝謝!這幾乎是我想要的。在某些情況下,GroupByUntil功能稍有改動。有時第一個通知沒有被緩衝,第一個緩衝區實際上需要'SpecifiedCount + 1'通知發送出去。你能想到這會發生的原因嗎? – supertopi

+0

順便說一下,在'TestScheduler'上運行時發生這種情況,使用重載'Buffer(IObservable,TimeSpan,int,IScheduler)' – supertopi