2013-06-26 63 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来存储一些显然是字典的数据,并且只是在两个线程之间可能存在竞争条件的地方添加一个值到设置。我将在设置周围应用锁,并将您的帖子标记为答案。 –