私はRX 2.2.5を使用しています。私はこの問題は、それは非常にまれ要素の順序をミスしないことをGROUPBYの後に来る、それはすべての要素のシーケンスを取得する前にGROUPBYRx.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));
})
とサブオーダーを読み込む2つの景色を眺めることができます。私はログから明らかなように、その並行性の問題は考えていません。これらのログを生成するには、カスタムスヌープ拡張メソッドを使用します。
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})
フォーマット時間:(スレッド):メッセージ
GROUPBY onNextが二回呼び出される前に、あなたが見ることができるように、それは1を逃した後。 ここでRx文法に問題がありますか、それとも問題ですか?どんな洞察も助けになるだろうか?それ以上の明確化が必要な場合は、親切にコメントしてください。
更新: 追加作業/望ましいログ:
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})
アップデート2:fireNewMapEntryがtrueの場合にのみ可能性のあるバグや機能
GROUPBYは、(GroupBy.cs)をgroupedObservableを発射し、これが起こりますここに
if (!_map.TryGetValue(key, out writer))
{
writer = new Subject<TElement>();
_map.Add(key, writer);
fireNewMapEntry = true;
}
ここで、_mapのタイプはDictionary<TKey, ISubject<TElement>>
です。これは問題になる可能性がありますか?
私は100で、ほとんど一度、それはほとんど起こっていない質問で述べたようにあなたがgroupbyの後にログを見ると、2つの異なるobservableが得られ、2つの異なるgroupedObservableになるはずです。私は2つのonNextを期待しています..私は事件のためのログで質問を更新します。 – MKMohanty
@LeeCampbellからメモを取って、querysコーディングスタイルを強化することをお勧めします。あなたの購読スタイルから、おそらくどこかに隠された競合状態があり、それは "乱雑さ"を作り出します。 'GroupBy'はサブスクリプションが破棄されて、やり直された後、同じキーに対して新しい' IGroupedObsevable'を生成するので、私の答えは有効だと私は信じています。 – supertopi