簡體   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