订阅observable时出现Reactive Extensions错误

时间:2013-06-26 19:52:05

标签: c# .net windows-phone system.reactive

我在使用嵌入式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
});

有趣的是我正在使用字典,但我一直在检查密钥存在,所以我可以排除它们。我的第一个想法是它可能是一个内部错误。谁能帮助我?

1 个答案:

答案 0 :(得分:2)

您发布的代码似乎没问题,Observable的错误处理程序捕获了异常。你提到的Dictionary对象让它听起来像某个地方的竞争条件,这可能解释了为什么你发现它难以重现。当涉及线程时,检查字典是否已包含密钥是不够的。两个线程可以同时检查相同的密钥,并且两者都可能发现该密钥不存在。他们都会尝试添加到字典中,但只有一个会成功,而另一个可能会导致你的异常。您必须在与这些词典交互的代码周围使用锁,或者您可以在需要的位置切换ConcurrentDictionary的词典。