繁体   English   中英

C# Rx Observable 将单个事件折叠成批次

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM