1

組み込みの Rx ライブラリを使用すると、Windows Phone プラットフォームで謎のエラーが発生します。

これがコール スタックです。これらはエラー レポートを通じてユーザーから寄せられたものです。エミュレーターでこのエラーを再現できず、開発用の電話でもエラーが発生しませんでした。

同じキーを持つアイテムが既に追加されています。Microsoft.Phone.Reactive.ObservableExtensions.b_ 3[TSource](例外例外) Microsoft.Phone.Reactive.AnonymousObserver 1.Error(Exception exception) at Microsoft.Phone.Reactive.AbstractObserver1.OnError(例外例外) Microsoft.Phone.Reactive.AnonymousObservable 1.AutoDetachObserver.Error(Exception exception) at Microsoft.Phone.Reactive.AbstractObserver1.OnError(例外例外) Microsoft .Phone.Reactive.Observable.<>c _DisplayClass17b`1.<>c_ DisplayClass17d. <>c _DisplayClass181.b__178(オブジェクト _)

私は主に Rx を使用してワーカー スレッドを開始し、次のように UI スレッドでそれらにサブスクライブします。

Observable.Start(() =>
{
    // do background work
    return result;
})
.ObserveOnDispatcher()
.Subscribe((result) =>
{
    // do UI work
});

興味深いのは、辞書を使用しているということですが、常にキーの存在をチェックしているため、それらを除外できます。私の最初の考えは、内部エラーである可能性があるということです。誰か助けてくれませんか?

4

1 に答える 1

2

投稿したコードは問題ないようで、Observable のエラー ハンドラによって例外がキャッチされています。Dictionary オブジェクトについて言及すると、どこかで競合状態のように聞こえます。これが、再現が難しい理由を説明している可能性があります。スレッド化が関係している場合、Dictionary にキーがまだ含まれていないことを確認するだけでは不十分です。2 つのスレッドが同時に同じキーをチェックする可能性があり、両方のスレッドがキーが存在しないことを検出する場合があります。どちらも辞書に追加しようとしますが、成功するのは 1 つだけで、もう 1 つが例外を引き起こしている可能性があります。これらの辞書と対話するコードの周りでロックを使用する必要があります。または、必要に応じてConcurrentDictionaryの Dictionary を切り替えることができます。

于 2013-06-26T20:44:36.950 に答える