.net Observable'OrserveOn'一个后台线程

时间:2012-01-24 16:08:33

标签: c# .net system.reactive observable

我正在尝试使用.net Observable类实现一个简单的Observer模式。我的代码看起来像这样:

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类来实现此模式的良好示例代码示例?

2 个答案:

答案 0 :(得分:15)

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

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

... .ObserveOn(scheduler). ...

工厂方法创建的线程是用于计划执行的线程。通过将属性ExitIfEmpty设置为false,此线程将不会终止,即使没有任何操作意味着它将在每次调用时重复使用。

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

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

答案 1 :(得分:5)

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