RxThrottle(…)。ObserveOn(Scheduler)和Throttle(...,Scheduler)之间的区别我有以下代码:正如预期的那样,UpdateUi()将始终在主线程上执行。当我将代码更改为IDisposablesubscription=myObservable.Throttle(TimeSpan.FromMilliseconds(50)).ObserveOn(RxApp.MainThreadScheduler).Subscribe(_=>UpdateUi());UpdateUI()将在后台线程中执行。为什么Throttle(...).ObserveOn(scheduler)不等同于Throttle(...,scheduler)?经过一些调查,我认为这是由于运行时使用了与我预期不同的Rx版本(我为第3方应用程序开发了一个插件)。我不确定为什么,但似乎默认的RxApp.MainThreadScheduler没有正确初始化。默认实例是WaitForDispatcherScheduler(来源)。此类中的所有函数都依赖于attemptToCreateScheduler:ISchedulerattemptToCreateScheduler(){if(_innerScheduler!=null)return_innerScheduler;尝试{_innerScheduler=_schedulerFactory();返回_innerScheduler;}catch(Exception){//NB:readynotey's.KeepusingCurrentThreadreturnCurrentThreadScheduler.Instance;在我的案例中似乎发生的是_schedulerFactory()抛出,导致CurrentThreadScheduler.Instance被返回。通过手动将RxApp.MainThreadScheduler初始化为newSynchronizationContextScheduler(SynchronizationContext.Current)行为是预期的。在代码的两个示例中,您将始终在RxApp.MainThreadScheduler指定的调度程序上调用RxApp.MainThreadScheduler。我可以肯定地说,因为ObserveOn是一个装饰器,可确保在指定的调度程序上调用订阅者的OnNext处理程序。请参阅此处进行深入分析。所以,这有点令人费解。RxApp.MainThreadScheduler没有引用正确的调度器调度器,或者UpdateUi正在传输调度器线程。前者并非前所未有-请参阅https://github.com/reactiveui/ReactiveUI/issues/768了解遇到此问题的其他人。我不知道那个案子有什么问题。也许@PaulBetts可以权衡一下,或者您可以在https://github.com/reactiveui/上提出问题。无论如何,我会仔细检查您的假设,因为我希望这是一个经过充分测试的领域。你有完整的复制品吗?至于你的具体问题,Throttle(...).ObserveOn(scheduler)和Throttle(...,scheduler)的区别如下:第一种情况,当没有调度器指定Throttle时,它??使用默认的平台调度器引入运行它的计时器所需的并发性-在WPF上,这将使用线程池线程。因此,所有节流都将在后台线程上完成,并且由于下面的ObserveOn,释放的事件将仅传递给指定调度程序上的订阅者。如果Throttle指定了一个调度器,则在该调度器上进行节流——抑制和释放的事件将在该调度器上进行管理,订阅者也将在同一调度器上被调用。无论哪种方式,UpdateUi都会在UpdateUi上调用RxApp.MainThreadScheduler。在大多数情况下,最好在调度程序上限制UI事件,因为在后台线程上运行单独的计时器通常成本更高,如果只有一小部分事件正在通过限制,则需要为上下文切换付费。因此,要检查您是否遇到RxApp.MainThreadScheduler问题,我会尝试通过其他方式明确指定调度程序或SynchronizationContext。如何执行此操作取决于您所在的平台-ObserveOnDispatcher()预计可用,或使用适当的ObserveOn重载。通过导入正确的Rx库,可以选择控件、同步转换和调度程序。以上就是C#学习教程:RxThrottle(...)。ObserveOn(scheduler)和Throttle(...,scheduler)的区别分享的所有内容,如果对你有用,需要详细了解C#学习教程,希望大家多多关注——本文来自网络收集,不代表如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
