gpt4 book ai didi

c# - .net Observable 'ObserveOn' 后台线程

转载 作者:太空狗 更新时间:2023-10-29 18:07:36 26 4
gpt4 key购买 nike

我正在尝试使用 .net Observable 类实现一个简单的观察者模式。我有这样的代码:

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 #。您将在调试器中看到这些名称。

关于c# - .net Observable 'ObserveOn' 后台线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8990061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com