【问题标题】:Reactive Extensions error when subscribing to an observable订阅 observable 时出现响应式扩展错误
【发布时间】:2013-06-24 03:09:49
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你能发布一些do background work代码吗?

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


【解决方案1】:

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

【讨论】:

  • 感谢您指出我错过的内容。实际上,我正在使用 IsolatedStorageSettings.ApplicationSettings 来存储一些数据,这显然是一个字典,并且只是找到了一个在两个线程之间可能存在竞争条件的地方,同时为设置添加了一个值。我将锁定设置,并将您的帖子标记为答案。
猜你喜欢
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
相关资源
最近更新 更多