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

use*_*225 8 .net c# 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));
Run Code Online (Sandbox Code Playgroud)

我希望观察者在后台线程上运行,但是我希望它们都在相同的后台线程上运行(对于我们真正的实现,将每个侦听器放在不同的线程上会非常复杂).

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

如何修改上述内容?

另外,在某种程度上相关的说明,是否有任何好的示例代码示例使用Observable该类来实现此模式?

Mar*_*age 16

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

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

... .ObserveOn(scheduler). ...
Run Code Online (Sandbox Code Playgroud)

工厂方法创建的线程是用于计划执行的线程.通过将属性ExitIfEmpty设置留给false该线程,即使没有任何事可做,也意味着它将被重用于每个调用.

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

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


Chr*_*ain 5

.ObserveOn(Scheduler.ThreadPool)采用线程调度程序,该调度程序指示观察运行的线程.对于单个线程,您希望使用EventLoopScheduler,而不是ThreadPool.