可观察缓冲区

时间:2017-02-16 11:24:00

标签: c# system.reactive

我正在开发一种解决方案,其中例如对于用户而言以高速率发生变化。 我需要的是记录每个更改,延迟通知,然后返回不同的更改,例如已更改的用户的用户ID。 我使用rx:

提出了以下代码
private Subject<int> userEventSubject= new Subject<int>();
userEventSubject
    .Buffer(EVENT_BUFFER_DELAY)
    .Where(buffer => buffer.Count > 0)                
    .Subscribe(OnEventBufferProcess);

这似乎工作正常,我得到了

添加的所有值
userEventSubject.OnNext(userId);

我的问题是:我可以区分更改,例如,当具有相同用户ID值的多个OnNext时,我不希望生成的缓冲区包含重复项。当然我可以在Subscribe处理程序中使用不同的值,但我想知道这是否可以在rx级别上完成?我尝试了不同的方法,但仍然可以得到所有的值。

由于我只想跟踪延迟期间所做的更改,返回订阅处理程序并重新开始,是否需要清除userEventSubject?

2 个答案:

答案 0 :(得分:3)

如果您使用Observable.Distinct方法,则会检查不同的IList<int>,这确实不是您想要的行为。

您似乎需要将distinct应用于缓冲区中的元素。

您可以使用Observable.Select方法将其应用于每个缓冲区:

private Subject<int> userEventSubject= new Subject<int>();
userEventSubject
    .Buffer(EVENT_BUFFER_DELAY)
    .Where(buffer => buffer.Count > 0)
    .Select(buffer => buffer.Distinct()) // distinct elements in each buffer
    .Subscribe(OnEventBufferProcess);

请注意,无论何时使用Distinct()方法,都需要警惕如何检查相等性,如果使用引用类型 - 您可能需要实现某种相等比较器。在这种情况下,这不是问题,因为您正在使用int s。

答案 1 :(得分:0)

您可以使用DistinctUntilChanged扩展方法:

private Subject<int> userEventSubject= new Subject<int>();
userEventSubject
    .DistinctUntilChanged()
    .Buffer(EVENT_BUFFER_DELAY)    
    .Where(buffer => buffer.Count > 0)                
    .Subscribe(OnEventBufferProcess);