我有2个线程,WPF + PIPE。我在管道rx事件上注册了WPF。 当使用ObserveOnDispatcher()时,不会调用已注册的处理程序,当删除ObserveOnDispatcher()时,它会在管道线程上调用。 有没有人知道为什么在使用ObserveOnDispatcher()时根本没有调用它?
答案 0 :(得分:7)
ObservableOnDispatcher
在调用时获取当前线程的调度程序。如果你从后台线程调用它,它将在该线程上寻找一个调度程序(如果它有一个)。
如果你想回调UI线程,你需要在UI线程上从IScheduler
获取Scheduler.Dispatcher
(就像在开始时一样)应用程序)并将该实例传递给您的后台线程。然后,您可以使用ObserveOn(dispatcherSchedulerInstance)
安排回UI线程。
答案 1 :(得分:0)
你能发一些代码吗? :)
一般情况下,我会寻找你可能阻塞ui线程的任何地方,因为wpf调度程序是单线程的,对调度程序的阻塞操作将导致你的订阅回调永远不会被执行。
答案 2 :(得分:0)
除了ObserveOnDispatcher()
使用当前调度程序而不是“主” UI调度程序之外,即使将ObserveOn()
与特定的先前捕获的调度程序调度程序配合使用,我也遇到了这种情况。
原来的问题是,使用某些可观察的方法,特别是Buffer()
重载(带有时间段),将可观察的对象与其先前的ObserveOn
上下文断开连接,并导致从单独的观察对象进行观察“计时器”任务。因此,ObserveOn
必须在调用Buffer()
之后完成。