1

我在使用嵌入式 Rx 库的 Windows Phone 平台上遇到了一个神秘的错误。

这是我得到的所有调用堆栈,因为它们来自我的用户通过错误报告。我无法在模拟器上重现此错误,而且我的开发手机上也没有。

已添加具有相同密钥的项目。在 Microsoft.Phone.Reactive.ObservableExtensions.b_ 3[TSource](Exception exception) 在 Microsoft.Phone.Reactive.AnonymousObserver 1.Error(Exception exception) at Microsoft.Phone.Reactive.AbstractObserver1.OnError(Exception exception) 在 Microsoft.Phone.Reactive.AnonymousObservable 1.AutoDetachObserver.Error(Exception exception) at Microsoft.Phone.Reactive.AbstractObserver1.OnError(Exception exception) 在 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
});

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

4

1 回答 1

2

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

于 2013-06-26T20:44:36.950 回答