Я использую RX 2.2.5. У меня есть 2 мнения, которые загружаются суб заказов сRx.Net GroupBy реализация отсутствует последовательность элементов редко
_transportService
.ObserveSubOrder(parentOrder.OrderId)
.SubscribeOn(_backgroundScheduler)
.ObserveOn(_uiScheduler)
.Where(subOs => subOs != null)
.Snoop("BeforeGrpBy")
.GroupBy(subOs => subOs.OrderId)
.Subscribe(subOrdUpdates =>
{
AddIfNew(subOrdUpdates.Key, subOrdUpdates.Snoop("AfterGrpBy" + "--" + subOrdUpdates.Key));
})
Перед группеГо он получит всю последовательность элементов, проблема возникает после того, как GroupBy, что он пропускает очень редко последовательность элементов. Я не думаю, что это проблема параллелизма, как видно из журналов. Пользовательский метод расширения Snoop используется для генерации этих журналов. Время
16:15:44.8169968 : (1) : BeforeGrpBy: OnNext({ OrderId = 9Zsj8Z4sTRb, OrderType = WNX6, Quantity = 10, Price = 178.78125})
16:15:44.8169968 : (1) : AfterGrpBy--9Zsj8Z4sTRb: Observable obtained
16:15:44.8369988 : (9) : AfterGrpBy--9Zsj8Z4sTRb: Subscribed to on.
16:15:44.8379989 : (1) : BeforeGrpBy: OnNext({ OrderId = 9Zsj8Z4sTRb, OrderType = WNX6, Quantity = 10, Price = 178.78125})
16:15:44.8379989 : (9) : AfterGrpBy--9Zsj8Z4sTRb: Subscription completed.
16:15:44.8590010 : (1) : AfterGrpBy--9Zsj8Z4sTRb: Observable obtained
16:15:44.8600011 : (9) : AfterGrpBy--9Zsj8Z4sTRb: Subscribed to on.
16:15:44.8610012 : (9) : AfterGrpBy--9Zsj8Z4sTRb: Subscription completed.
16:15:44.8620013 : (1) : AfterGrpBy--9Zsj8Z4sTRb: OnNext({ OrderId = 9Zsj8Z4sTRb, OrderType = WNX6, Quantity = 10, Price = 178.78125})
Формат: (Thread): Msg
Как вы можете видеть, прежде чем GroupBy onNext вызывается дважды, но после того, как он пропустил один. Что-то не так с грамматикой Rx здесь или это известная проблема? Любое понимание поможет? Если какое-либо дополнительное разъяснение требуется, пожалуйста, прокомментируйте.
Update: Добавление работы/желательные журналы:
16:15:45.1070258 : (1) : BeforeGrpBy: OnNext({ OrderId = 44Fqp3ubNmL, OrderType = TTT6, Quantity = 39, Price = 130.21875})
16:15:45.1280279 : (1) : AfterGrpBy--44Fqp3ubNmL: Observable obtained
16:15:45.1310282 : (10) : AfterGrpBy--44Fqp3ubNmL: Subscribed to on.
16:15:45.1320283 : (10) : AfterGrpBy--44Fqp3ubNmL: Subscription completed.
16:15:45.1320283 : (1) : AfterGrpBy--44Fqp3ubNmL: OnNext({ OrderId = 44Fqp3ubNmL, OrderType = TTT6, Quantity = 39, Price = 130.21875})
16:15:45.1330284 : (1) : BeforeGrpBy: OnNext({ OrderId = 44Fqp3ubNmL, OrderType = TTT6, Quantity = 39, Price = 130.21875})
16:15:45.1330284 : (1) : AfterGrpBy--44Fqp3ubNmL: Observable obtained
16:15:45.1340285 : (10) : AfterGrpBy--44Fqp3ubNmL: Subscribed to on.
16:15:45.1340285 : (10) : AfterGrpBy--44Fqp3ubNmL: Subscription completed.
16:15:45.1350286 : (1) : AfterGrpBy--44Fqp3ubNmL: OnNext({ OrderId = 44Fqp3ubNmL, OrderType = TTT6, Quantity = 39, Price = 130.21875})
UPDATE2: Возможная ошибка или особенность
GroupBy выстреливает groupedObservable только если fireNewMapEntry истинно, (GroupBy.cs) и это происходит здесь
if (!_map.TryGetValue(key, out writer))
{
writer = new Subject<TElement>();
_map.Add(key, writer);
fireNewMapEntry = true;
}
где _map имеет тип Dictionary<TKey, ISubject<TElement>>
. Это может быть проблема?
Как я уже говорил в вопросе это происходит редко, почти раз в 100 .. и если вы видите журналы после groupby, получается 2 разных наблюдаемых, которые должны приводить к 2 различным группам, которые могут быть связаны, и, следовательно, Я ожидаю 2 onNext .. Я обновлю вопрос с журналами для рабочих случаев. – MKMohanty
Я предлагаю вам делать заметки с @LeeCampbell, чтобы улучшить стиль кодирования ваших запросов. Из вашего стиля подписки, вероятно, скрывается какое-то условие гонки, которое создает «случайность». Я считаю, что мой ответ верен, так как «GroupBy», конечно же, создает новый «IGroupedObsevable» для того же ключа после того, как подписка была удалена и продолжена снова. – supertopi