У меня есть приложение, которое отслеживает колебания цен на молоко по штатам. Пользователи, увидев цену на молоко в местном продуктовом магазине, могут зайти на веб-сайт и указать эту цену (во многом как у GasBuddy).
Когда они отправляют цену, я получаю ее в своем Observable‹MilkPrice›, вот реализация цены на молоко
class MilkPrice {
string State {get;set;}
decimal Price {get;set;}
}
Когда я получаю цену, я сохраняю список объектов MilkPriceTracker для каждого состояния. Если объект для определенного состояния не существует, я добавляю его в свой объект List. 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 тысяча пользователей из Вирджинии начинает сообщать цены одновременно... .
Когда первый парень сообщит, он создаст новый объект Tracker, и его сообщение будет пропущено, потому что оно уже использовано, я мог бы попробовать передать Observable.Concat(Observable.Return(alreadyReceivedObj), mainObservable.Wher.....)) конструктору
Я попробовал это, но из-за высокой частоты сообщений некоторые из них все еще пропускаются к тому времени, когда обрабатывается подписка mainObservable.OnNext и создается новый трекер.
Как мне «приостановить» mainObservable и сказать ему «DVR» или «буферизировать», пока я не возобновлю? поэтому я не пропускаю сообщения.
Если я недостаточно ясен, не стесняйтесь сказать мне
Спасибо.