我正在尝试使用.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
类来实现此模式的良好示例代码示例?
答案 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。