[英].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.