2011-05-18 69 views
3

我有2個線程,WPF + PIPE。我在管道rx事件中註冊WPF。 當使用ObserveOnDispatcher()時,不會調用註冊的處理程序,當移除ObserveOnDispatcher()時,會在管道線程上調用它。 有沒有人有想法,爲什麼它使用ObserveOnDispatcher()時根本沒有被調用?ObserveOnDispatcher無法正常工作

回答

7

ObservableOnDispatcher在調用當前線程時調用調度程序。如果你從後臺線程調用它,它會在該線程上尋找一個調度器(如果它有一個)。

如果要回調到UI線程,你需要的ISchedulerScheduler.Dispatcher而UI線程(比如在應用程序的開始)上獲得該實例傳遞給你的後臺線程。然後,您可以使用ObserveOn(dispatcherSchedulerInstance)安排回UI線程。

0

你能發表一些代碼嗎? :)

一般來說,我會尋找任何可能阻止ui線程的地方,因爲wpf調度器是單線程的,調度器上的阻塞操作將導致您的訂閱回調永遠不會執行。

+0

我剛剛發現,當我從管道線程調用ObserveOnDispatcher()。subscribe()時,它不會,但是當我從WPF線程調用它時,它工作正常! – ie1 2011-05-18 11:09:46

+0

ObserveOnDispatcher使用'當前'調度程序,所以對於普通線程來說,這將是ThreadPool。從一個wpf線程,它將使用與該線程相關聯的wpf調度程序。即時通訊不知道我明白,如果你的問題已得到解決或雖然:) – aL3891 2011-05-18 11:16:17

+0

它解決了,因爲我將訂閱移動到WPF線程。但是我認爲ObserveOnDispatcher方法將在應用程序WPF調度程序上進行註冊,而這個調用程序會被調用。 – ie1 2011-05-18 11:24:56