[英]C# Rx Observable collapse individual events to batches
我有一個IObservable
正在流式傳輸單個事件,我想將它們批處理到另一個流式傳輸事件批次的IObservable
中。 我嘗試這樣寫它;
class MyEvent
{
public string Description {get; set;}
}
class EventsBatch
{
public MyEvent[] Batch {get; set;}
}
IObservable<EventsBatch> ConvertToBatches(IObservable<MyEvent> observable, int batchSize)
{
var eventsAccumulator = new List<MyEvent>();
var subject = new ReplaySubject<EventsBatch>();
var completionSource = new TaskCompletionSource<object>();
var subscription = observable.Subscribe(events =>
{
eventsAccumulator.Add(events);
if (eventsAccumulator.Count == batchSize)
{
subject.OnNext(new EventsBatch { Batch = eventsAccumulator.ToArray() });
eventsAccumulator.Clear();
}
},
ex => completionSource.TrySetException(ex),
() =>
{
subject.OnNext(new EventsBatch { Batch = eventsAccumulator.ToArray() });
subject.OnCompleted();
completionSource.TrySetResult(null);
});
completionSource.Task.Wait();
subscription.Dispose();
subject.OnCompleted();
return subject;
}
這會阻塞,直到整個 stream 在流式傳輸生成的批次之前完成,這在最好的情況下將具有糟糕的性能,並且在不確定的 stream 的情況下永遠不會返回。
這樣做的正確方法是什么?
我想我可能已經想通了;
IObservable<EventsBatch> convertToBatches(IObservable<MyEvent> observable, int batchSize)
{
return observable.Buffer(batchSize).Select(e => new EventsBatch{ Batch = e.ToArray() });
}
如果可能,請提出更好的解決方案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.