2013-06-26 102 views
1

我在使用嵌入式Rx庫的Windows Phone平臺上發現了一個神祕錯誤。訂閱可觀察對象時出現無效擴展錯誤

以下是調用堆棧,這是我得到的,因爲它們來自我的用戶通過錯誤報告。我無法在模擬器上重現此錯誤,並且我沒有在我的開發手機上獲得它。

已添加具有相同密鑰的項目。 在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 (例外例外) at Microsoft.Phone.Reactive.Observable。 <> c _DisplayClass17b`1。 <> c_ DisplayClass17d。 <>Ç _DisplayClass181.b__178(對象_)

我使用的Rx主要用於啓動工作線程和訂閱它們在UI線程上類似如下:

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

有趣的是,我使用字典,但我一直在檢查關鍵的存在,所以我可以排除它們。我的第一個想法是它可能是一個內部錯誤。任何人都可以幫我嗎?

+0

你可以發佈一些'do background work'代碼嗎? – Brandon

回答

2

您發佈的代碼看起來不錯,異常正在被Observable的錯誤處理程序捕獲。你提到的Dictionary對象使得它聽起來像某處的競爭條件,這可能解釋了爲什麼你很難重現。在涉及線程時檢查Dictionary是否已經不包含密鑰是不夠的。兩個線程可以同時檢查相同的密鑰,並且都可能發現該密鑰不存在。他們都會嘗試添加到字典中,但只有一個會成功,另一個可能會導致您的異常。您必須在與這些字典交互的代碼周圍使用鎖,或者您可以在需要的地方將字典切換爲ConcurrentDictionary

+0

感謝您指出我錯過了什麼。實際上,我使用IsolatedStorageSettings.ApplicationSettings來存儲一些顯然是字典的數據,並且只是在兩個線程之間可能存在競爭條件的地方添加一個值到設置。我將在設置周圍應用鎖,並將您的帖子標記爲答案。 –