2012-10-17 69 views
3

有什么办法强制Observable.Buffer在缓冲时间结束之前刷新?强制刷新到Observable.Buffer c#

在这个例子中:

mSubscription = mFluxObservable.Buffer(new TimeSpan(0, 0, 1, 30)).Subscribe(o => saver(o, iSessionId));

我想一时半期完成之前刷新数据!

回答

7

这为我工作:

var subject = new Subject<Unit>(); 
var closing = Observable 
    .Timer(new TimeSpan(0, 0, 1, 30)) 
    .Select(x => Unit.Default); 

var query = 
    mFluxObservable 
     .Buffer(() => Observable 
      .Amb(subject, closing) 
      .Take(1)); 

现在我只需要调用subject.OnNext(Unit.Default)迫使缓冲刷新。刷新后立即启动新的缓冲区。

3

...基本上相同的主要使用的窗口:

var bufferPeriod = TimeSpan.FromSeconds(1.5); 
var source = Observable.Interval(TimeSpan.FromMilliseconds(100)).Take(50); 

//source.Buffer(bufferPeriod).Dump(); 

var bufferFlush = new Subject<long>();//Or Subject<Unit> 
source.Window(
     ()=>Observable.Merge(Observable.Timer(bufferPeriod), bufferFlush)) 
    .Select(window=>window.ToList()) 
    .Dump(); 

//Simulate calling flush. 
Observable.Interval(TimeSpan.FromMilliseconds(1350)).Take(2).Subscribe(bufferFlush);