繁体   English   中英

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

[英].net Observable 'ObserveOn' a background thread

我试图使用.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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM