13

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

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

4

2 回答 2

19

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

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

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

工厂方法创建的线程是用于调度执行的线程。通过将属性ExitIfEmpty设置保留给false该线程,即使无事可做,它也不会终止,这意味着它将被重用于每次调用。

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

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

于 2012-01-24T16:19:14.687 回答
6

.ObserveOn(Scheduler.ThreadPool)采用一个线程调度程序,它指示观察运行所在的线程。看起来您想使用EventLoopScheduler而不是 ThreadPool 的单个线程。

于 2012-01-24T16:12:31.327 回答