我在使用嵌入式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(异常异常)
在Microsoft.Phone.Reactive.Observable。<> c _DisplayClass17b`1。<> c_ DisplayClass17d。<> c _DisplayClass181.b__178(Object _)
我主要使用Rx来启动工作线程并在UI线程上订阅它们,如下所示:
Observable.Start(() =>
{
// do background work
return result;
})
.ObserveOnDispatcher()
.Subscribe((result) =>
{
// do UI work
});
有趣的是我正在使用字典,但我一直在检查密钥存在,所以我可以排除它们。我的第一个想法是它可能是一个内部错误。谁能帮助我?
答案 0 :(得分:2)
您发布的代码似乎没问题,Observable的错误处理程序捕获了异常。你提到的Dictionary对象让它听起来像某个地方的竞争条件,这可能解释了为什么你发现它难以重现。当涉及线程时,检查字典是否已包含密钥是不够的。两个线程可以同时检查相同的密钥,并且两者都可能发现该密钥不存在。他们都会尝试添加到字典中,但只有一个会成功,而另一个可能会导致你的异常。您必须在与这些词典交互的代码周围使用锁,或者您可以在需要的位置切换ConcurrentDictionary的词典。