2013-06-26 3 views
1

Я получаю загадочную ошибку на платформе Windows Phone, используя встроенную Rx-библиотеку.Ошибка реактивных расширений при подписке на наблюдаемый

Вот стек вызовов, который у меня есть, поскольку они поступают от моих пользователей через отчеты об ошибках. Я не могу воспроизвести эту ошибку на эмуляторе, и я не получил ее на своем телефоне.

Элемент с таким же ключом уже добавлен. на Microsoft.Phone.Reactive.ObservableExtensions.b_ 3 [TSource] (исключение Исключение) в Microsoft.Phone.Reactive.AnonymousObserver 1.Error(Exception exception) at Microsoft.Phone.Reactive.AbstractObserver 1.OnError (исключение) Исключение в Microsoft.Phone.Reactive.AnonymousObservable 1.AutoDetachObserver.Error(Exception exception) at Microsoft.Phone.Reactive.AbstractObserver 1.OnError (Исключение исключения) в Microsoft.Phone.Reactive.Observable. <> c _DisplayClass17b`1. <> c_ DisplayClass17d. <> с _DisplayClass181.b__178 (Object _)

Я использую Rx в основном для запуска рабочих потоков и подписаться на них в потоке пользовательского интерфейса, как следующее:

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

Интересно то, что я используя словари, но я все время проверяю существование ключа, поэтому я могу их исключить. Моя первая мысль - это внутренняя ошибка. Может ли кто-нибудь помочь мне?

+0

Можете ли вы опубликовать некоторые из кода 'do background work'? – Brandon

ответ

2

Код, который вы опубликовали, выглядит нормально, и исключение ловутся обработчиком ошибок Observable. Ваше упоминание о предметах словаря делает это звуком как условие гонки где-то, что может объяснить, почему вам трудно воспроизвести. Проверка того, что словарь не содержит ключа, недостаточно, если задействована потоковая передача. Два потока могут одновременно проверять один и тот же ключ, и оба могут обнаружить, что ключ отсутствует. Они оба попытаются добавить в словарь, но только один будет успешным, а другой, скорее всего, вызовет ваше исключение. Вы должны использовать блокировки вокруг кода, который взаимодействует с этими словарями, или вы можете переключать словарь для ConcurrentDictionary, где вам нужно.

+0

Спасибо за то, что я пропустил. Фактически я использую IsolStorageSettings.ApplicationSettings для хранения некоторых данных, которые, очевидно, являются словарем, и просто нашел место, где может быть состояние гонки между двумя потоками при добавлении значения к настройкам. Я буду применять блокировки вокруг настроек и пометьте ваше сообщение как ответ. –