ObserveOnDispatcher не работает - PullRequest
3 голосов
/ 18 мая 2011

У меня 2 темы, WPF + ТРУБА.Я регистрирую из WPF на событие pipe rx.при использовании ObserveOnDispatcher () зарегистрированный обработчик не вызывается, при удалении ObserveOnDispatcher () он вызывается в потоке канала.У кого-нибудь есть идеи, почему он вообще не вызывается при использовании ObserveOnDispatcher ()?

Ответы [ 3 ]

7 голосов
/ 18 мая 2011

ObservableOnDispatcher принимает диспетчер текущего потока в тот момент, когда он вызывается.Если вы вызываете его из фонового потока, он будет искать диспетчера в этом потоке (если он есть).

Если вы хотите перезвонить потоку пользовательского интерфейса, вам нужно получить1006 * из Scheduler.Dispatcher в потоке пользовательского интерфейса (как в начале приложения) и передать этот экземпляр в фоновый поток.Затем вы можете использовать ObserveOn(dispatcherSchedulerInstance), чтобы вернуться к потоку пользовательского интерфейса.

0 голосов
/ 06 февраля 2019

Помимо ObserveOnDispatcher() с использованием текущего диспетчера, а не "основного" диспетчера пользовательского интерфейса, я столкнулся с этим даже при использовании ObserveOn() с определенным ранее захваченным диспетчером диспетчера.

Проблема оказалась в том, что использование некоторых наблюдаемых методов, в частности перегрузок Buffer() с периодом времени, отключает наблюдаемое от его предыдущего контекста ObserveOn и заставляет наблюдать его из отдельной задачи «таймер» , В результате, ObserveOn должно быть сделано после вызова Buffer().

0 голосов
/ 18 мая 2011

Можете ли вы опубликовать код? :)

В общем, я бы искал любое место, где вы могли бы блокировать поток пользовательского интерфейса, так как диспетчер wpf является однопоточным, операция блокировки на диспетчере приведет к тому, что ваш обратный вызов подписки никогда не будет выполнен.

...