我有2个线程,WPF+PIPE。我在管道 rx 事件上注册了来自 WPF 的。使用 ObserveOnDispatcher() 时,不会调用已注册的处理程序,当删除 ObserveOnDispatcher() 时,它会在管道线程上调用。有没有人知道为什么在使用 ObserveOnDispatcher() 时根本不调用它?
DispatcherObservable.ObserveOnDispatcher
在调用当前线程时获取当前线程的调度程序。如果从后台线程调用它,它将在该线程上查找调度程序(如果有)。
如果要回调 UI 线程,则需要在 UI 线程上(如在应用程序开始时)从Scheduler.Dispatcher
获取IScheduler
,并将该实例传递给后台线程。然后,可以使用ObserveOn(dispatcherSchedulerInstance)
计划回 UI 线程。
你能发布一些代码吗? :)
通常,我会寻找可能阻止 ui 线程的任何地方,因为 wpf 调度程序是单线程的,调度程序上的阻止操作将导致您的订阅回调永远不会执行。
除了ObserveOnDispatcher()
使用当前调度程序而不是"主"UI 调度程序之外,即使将ObserveOn()
与先前捕获的特定调度程序调度程序一起使用,我也遇到了这个问题。
事实证明,问题在于使用一些可观察的方法,特别是具有时间段的Buffer()
重载,会使可观察量与其先前的ObserveOn
上下文断开连接,并导致从单独的"计时器"任务中观察到它。 因此,必须在调用Buffer()
后完成ObserveOn
。