我在使用嵌入式Rx库的Windows Phone平台上遇到一个神秘错误。
这是我得到的调用堆栈,因为它们来自我的用户通过错误报告。我无法在模拟器上重现这个错误,我也没有在我的开发手机上得到它。
已添加具有相同键的项目。位于Microsoft.Phone.Reactive.ObsObservableExtensions.b3[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。电话。反应式。可观察。<>c_DisplayClass17b`1.<>c_显示类17d<>c_DisplayClass181.b_178(对象)
我使用Rx主要用于启动工作线程,并在UI线程上订阅它们,如下所示:
Observable.Start(() =>
{
// do background work
return result;
})
.ObserveOnDispatcher()
.Subscribe((result) =>
{
// do UI work
});
有趣的是,我正在使用字典,但我一直在检查密钥是否存在,所以我可以排除它们。我的第一个想法是这可能是一个内部错误。有人能帮我吗?
您发布的代码似乎还可以,并且Observable的错误处理程序正在捕获异常。你提到Dictionary对象会让它听起来像某个地方的种族状况,这可能是你发现难以复制的原因。当涉及线程时,检查字典中是否还没有包含关键字是不够的。两个线程可能同时检查同一个键,但都可能发现该键不存在。他们都会尝试添加到字典中,但只有一个会成功,另一个可能会导致您的异常。您必须在与这些字典交互的代码周围使用锁,或者您可以在需要的地方将Dictionary切换为ConcurrentDictionary。