我有多个数据源,它们共享我需要重新同步的标记/密钥。类型签名看起来有点像这样:
IObservable<R> JoinOnKey<T,R>(IObservable<T>[] sources,
Func<T,int> getKey,
Func<T[],R> projection)
不幸的是,有两个并发症:
这意味着该功能需要放弃&#39;在一段时间后等待。所以签名改为:
IObservable<R> JoinOnKey<T,R>(IObservable<T>[] sources,
Func<T,int> getKey,
Func<T[],R> projection,
int maxItemsToWaitBeforeGivingUp)
在研究了Buffer,Join,GroupJoin,Zip等之后,我最终破解了我自己的解决方案,该解决方案维护了一个内部数组队列,必须锁定每个新的传入项目。我对此并不满意,所以我对任何有关潜在“清洁”的想法或建议感兴趣。的解决方案。
答案 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));