[英]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.