简体   繁体   English

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

[英]C# Rx Observable collapse individual events to batches

I have an IObservable that is streaming individual events and I want to batch these up into another IObservable that streams batches of events.我有一个IObservable正在流式传输单个事件,我想将它们批处理到另一个流式传输事件批次的IObservable中。 I had a stab at writing it like this;我尝试这样写它;

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;
}

This blocks until the entire stream is complete before streaming the resulting batches, which is going to have terrible performance in the best case and never return in the case of an indefinite stream.这会阻塞,直到整个 stream 在流式传输生成的批次之前完成,这在最好的情况下将具有糟糕的性能,并且在不确定的 stream 的情况下永远不会返回。

What is the correct way to do this?这样做的正确方法是什么?

I think I may have figured it out;我想我可能已经想通了;

IObservable<EventsBatch> convertToBatches(IObservable<MyEvent> observable, int batchSize)
{
    return observable.Buffer(batchSize).Select(e => new EventsBatch{ Batch = e.ToArray() });
}

Please suggest better solution if possible如果可能,请提出更好的解决方案

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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