我有一个应用程序跟踪各州的牛奶价格波动,当用户看到当地杂货店的牛奶价格可以来到网站并提交该价格时(非常像GasBuddy)。
当他们提交价格时,我会在我的Observable< MilkPrice>中收到它,这里是牛奶价格实施
class MilkPrice {
string State {get;set;}
decimal Price {get;set;}
}
在我接受的价格,我保持MilkPriceTracker的列表对象的每一个国家,如果对象为特定的状态不存在,我把它添加到我的列表对象,MilkPriceTracker是一个视图模型这需要的IObservable在构造函数中这就是我构建Tracker对象的方法
if (!_statesTracker.Any(s => s.State.Equals(receivedInOnNext.State)) {
_statesTracker.Add(new MilkPriceTracker (mainObservable.Where(s.State.Equals(receivedInOnNext.State));
}
默认情况下,我没有将所有50个州添加到我的列表中,因为我只想报告任何价格的状态,现在这里是有趣的部分,比如来自弗吉尼亚州的1千名用户同时开始报告价格....
在第一帅哥报道,他将建造新的跟踪对象,他的信息将被错过了,因为已经被消耗掉,我可以尝试通过Observable.Concat(Observable.Return(alreadyReceivedObj),mainObservable.Wher .... 。))到构造函数
我尝试了但是由于消息的频率很高,有些东西仍然被mainObservable的订阅时遗漏.OnNext被处理并且构建了新的Tracker。
如何“暂停”mainObservable并告诉它“DVR”它或“缓冲”它直到我恢复?所以我不会错过任何消息。
如果我不够清楚,请随时告诉我
感谢。
答案 0 :(得分:2)
它不会发出 bizzare ,更像是对反应式编程缺乏了解。 ; - )
尝试使用GroupBy
。
答案 1 :(得分:0)
我写了以下代码来解决我的问题。
mainObservable
.GroupBy(k => k.State)
.Select(g => new MilkPriceTracker(g.Key, g))
.ObserveOnDispatcher(DispatcherPriority.DataBind)
.Subscribe(_statesTrackers.Add);