【问题标题】:.net Observable 'ObserveOn' a background thread.net Observable 'ObserveOn' 一个后台线程
【发布时间】:2012-02-17 21:21:59
【问题描述】:

我正在尝试使用 .net Observable 类实现一个简单的观察者模式。我的代码如下所示:

Observable.FromEventPattern<PropertyChangedEventArgs>(
    Instance.User,
    "PropertyChanged")
          .Where(e => e.EventArgs.PropertyName == "FirstName")
          .ObserveOn(Scheduler.ThreadPool)
          .Subscribe(search => OnFirstNameChanged(search.EventArgs));

Observable.FromEventPattern<PropertyChangedEventArgs>(
    Instance.User,
    "PropertyChanged")
          .Where(e => e.EventArgs.PropertyName == "LastName")
          .ObserveOn(Scheduler.ThreadPool)
          .Subscribe(search => OnLastNameChanged(search.EventArgs));

我希望观察者在后台线程上运行,但我希望它们都在同一个后台线程上运行(对于我们的实际实现,让每个侦听器都在不同的线程上太复杂了)。

即我希望所有 OnXXXChanged 逻辑都在 UI 线程以外的线程上执行,但我想确保它们在同一个线程上以正确的顺序运行,而不是在整个线程池上执行 Observing

上面应该如何修改?

另外,在一些相关的说明中,是否有任何使用Observable 类来实现此模式的好的示例代码示例?

【问题讨论】:

    标签: c# .net system.reactive observable


    【解决方案1】:

    您应该创建一个EventLoopScheduler 并在所有对ObserverOn 的调用中使用该单个实例:

    var scheduler = new EventLoopScheduler(ts => new Thread(ts));
    
    ... .ObserveOn(scheduler). ...
    

    工厂方法创建的线程是用于调度执行的线程。通过将属性ExitIfEmpty 设置为false,该线程将不会终止,即使没有任何事情可做,这意味着它将被重复用于每次调用。

    不过,您也可以考虑使用Scheduler.NewThread。如果无事可做,使用该调度程序将允许线程终止。当ObserverOn 将更多工作排队时,将创建一个新线程,但应该只存在一个线程,这意味着您没有同步不同的观察者。

    EventLoopScheduler(由Scheduler.NewThread 使用)创建的线程被命名为Event Loop #。您将在调试器中看到这些名称。

    【讨论】:

    • EventLoopScheduler 实现了 IDisposable,因此您将负责处理它。您可以使用 Using observable factory 方法将生命周期与订阅绑定。
    • Scheduler.NewThread 现在已弃用,您应该改用 NewThreadScheduler.Default。
    • 请注意不要稍加修改就使用上面的答案。必须设置IsBackground=true,例如:var scheduler = new EventLoopScheduler(ts =&gt; new Thread(ts) { IsBackground = true });。如果未设置,则如果该线程仍处于活动状态,它将阻止进程退出。
    【解决方案2】:

    .ObserveOn(Scheduler.ThreadPool) 采用一个线程调度程序,它指示运行观察的线程。对于单个线程,您似乎想使用EventLoopScheduler,而不是 ThreadPool。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      相关资源
      最近更新 更多