在密钥上加入n个可观察源,可能缺少密钥

时间:2015-03-04 06:43:03

标签: c# system.reactive

我有多个数据源,它们共享我需要重新同步的标记/密钥。类型签名看起来有点像这样:

IObservable<R> JoinOnKey<T,R>(IObservable<T>[] sources, 
                              Func<T,int> getKey, 
                              Func<T[],R> projection)

不幸的是,有两个并发症:

  1. 某些消息来源可能缺少标签,但我仍然希望获得其他消息
  2. 这意味着该功能需要放弃&#39;在一段时间后等待。所以签名改为:

    IObservable<R> JoinOnKey<T,R>(IObservable<T>[] sources, 
                                  Func<T,int> getKey, 
                                  Func<T[],R> projection,
                                  int maxItemsToWaitBeforeGivingUp)
    
    1. 虽然标签在每个来源上以相同(递增)的顺序到达,但是有一个上游“重置”&#39;可以将它们全部设置为零的功能。
    2. 在研究了Buffer,Join,GroupJoin,Zip等之后,我最终破解了我自己的解决方案,该解决方案维护了一个内部数组队列,必须锁定每个新的传入项目。我对此并不满意,所以我对任何有关潜在“清洁”的想法或建议感兴趣。的解决方案。

1 个答案:

答案 0 :(得分:1)

你提到在一段时间后放弃,但你的代码有一个参数,在一定数量的项目后放弃。我将假设代码是一个错字。

我认为此代码满足您的第一个约束。我不是100%肯定你的第二个约束。您是否收到有关此重置事件的通知?如果没有这样的通知,我不确定你是否可以正确处理它。

var count = sources.Length;
var timer = Observable.Timer(maxTimeToWaitBeforeGivingUp);

sources
    .Merge()
    .GroupByUntil(getKey, g => g.Take(count).TakeUntil(timer).Count())
    .SelectMany(g => g.ToArray().Select(projection));