[英]Rx.NET How do I buffer stream data as a moving (sliding) window without delay?
我正在使用 Rx.NET 庫連接到交易數據,我想做的是連續緩沖最后 100 秒的數據並每 2 秒分析一次。 我正在使用以下 Buffer 方法重載:
tradeStream
.Buffer(TimeSpan.FromSeconds(100), TimeSpan.FromSeconds(2))
.Subscribe(data =>
{
//...
});
現在的問題是它作為 100 秒緩沖區工作 + 它等待 2 秒。 有沒有辦法以一定的間隔立即拍攝最后 100 秒的“快照”?
聽起來您為此需要內置運算符Window
。 有一個重載需要兩個TimeSpan
。
IObservable<IObservable<Trade>> query =
tradeStream
.Window(TimeSpan.FromSeconds(100.0), TimeSpan.FromSeconds(2.0));
這樣就開始了一個新的 observable,它每 2 秒持續 100 秒。
您可以考慮使用Replay
運算符將數據緩沖指定的持續時間,並使用Observable.Interval
方法在每個間隔發出緩沖數據。 要完成生成的序列,您可以使用TakeUntil
運算符。 下面是一個可能的實現。
/// <summary>
/// Emits a list every interval that contains all the currently buffered elements.
/// </summary>
public static IObservable<IList<TSource>> BufferHistorical<TSource>(
this IObservable<TSource> source,
TimeSpan interval, TimeSpan replayDuration)
{
ArgumentNullException.ThrowIfNull(source);
if (interval < TimeSpan.Zero)
throw new ArgumentOutOfRangeException(nameof(interval));
if (replayDuration < TimeSpan.Zero)
throw new ArgumentOutOfRangeException(nameof(replayDuration));
return source.Replay(replayed =>
{
return Observable
.Interval(interval)
.SelectMany(_ => replayed
.TakeUntil(Observable.Return(Unit.Default, Scheduler.CurrentThread))
.ToList())
.TakeUntil(replayed.LastOrDefaultAsync());
}, replayDuration, Scheduler.Immediate);
}
使用示例:
tradeStream
.BufferHistorical(TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(100))
.Subscribe(data =>
{
//...
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.