一个奇怪的场景,Observable导致观察者错过OnNext中的项目

时间:2013-09-13 07:20:00

标签: c# system.reactive reactive-programming observable

我有一个应用程序跟踪各州的牛奶价格波动,当用户看到当地杂货店的牛奶价格可以来到网站并提交该价格时(非常像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”它或“缓冲”它直到我恢复?所以我不会错过任何消息。

如果我不够清楚,请随时告诉我

感谢。

2 个答案:

答案 0 :(得分:2)

它不会发出 bizzare ,更像是对反应式编程缺乏了解。 ; - )

尝试使用GroupBy

答案 1 :(得分:0)

我觉得自己喜欢跳舞。感谢世界上最好的家伙Lee Campbell

我写了以下代码来解决我的问题。

mainObservable
            .GroupBy(k => k.State)
            .Select(g => new MilkPriceTracker(g.Key, g))
            .ObserveOnDispatcher(DispatcherPriority.DataBind)
            .Subscribe(_statesTrackers.Add);