.net可观测';ObserveOn';背景线程
本文关键字:背景 线程 ObserveOn 可观 net | 更新日期: 2023-09-27 18:21:20
我正在尝试使用.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
类来实现这种模式的好的示例代码?
您应该创建一个EventLoopScheduler,并在对ObserverOn
:的所有调用中使用该实例
var scheduler = new EventLoopScheduler(ts => new Thread(ts));
... .ObserveOn(scheduler). ...
工厂方法创建的线程是用于调度执行的线程。通过将属性ExitIfEmpty
设置为false
,即使没有任何事情可做,该线程也不会终止,这意味着它将在每次调用中重复使用。
但是,您也可以考虑使用Scheduler.NewThread
。如果没有更多的工作要做,使用该调度程序将允许线程终止。当ObserverOn
对更多的工作进行排队时,将创建一个新线程,但应该只存在一个线程,这意味着您不需要同步不同的观察者。
由EventLoopScheduler
创建的线程(由Scheduler.NewThread
使用)被命名为Event Loop #
。您将在调试器中看到这些名称。
.ObserveOn(Scheduler.ThreadPool)
采用一个线程调度程序,该程序指定观察运行的线程。对于单个线程,您似乎希望使用EventLoopScheduler,而不是ThreadPool。