繁体   English   中英

访问.NET标准库中的Dispatcher IScheduler

[英]Accessing Dispatcher IScheduler in .NET Standard libraries

这个问题描述了如何确保IObservable<>.Throttle通过将UI调度程序传递给ThrottleThrottle在UI线程上运行。 但是,我的Observable是在基于.NET Standard 1.5的共享库中定义的。 在.NET Standard中是否有相应的DispatcherScheduler.Instance ,还是应该从使用(WPF / UWP / etc)库中注入Scheduler?

.NET Standard的System.Reactive程序集中不存在DispatcherScheduler类。

可能的解决方法是使用SynchronizationContextScheduler与当前SynchronizationContext 当您在调用ObserveOn()时在UI线程上时, ObserveOn()的处理程序将在UI线程上运行。

当没有在UI线程上调用ObserveOn() ,整个过程都不​​起作用。 为了避免这种情况,您可以创建类似AppContext对象的东西,在UI初始化发生时进行设置,并使其在您的应用程序中可分发。 在此AppContext保存SynchronizationContext.Current ,您可以在具有AppContext任何位置的UI线程上创建一个观察者。

IObservable<EventArgs> myObservable = GetSomeObservableEvents();
var myScheduler = new SynchronizationContextScheduler(SynchronizationContext.Current);
myObservable.ObserveOn(myScheduler).Subscribe(ev =>
{
    // some code that should run on UI thread
});

我在Xamarin.Forms 2.5.0项目中使用它,我在.NET Standard 2.0中有一个包含ViewModels,Views等的应用程序项目。

在这种情况下,这个答案是有效的(至少):

  • .NET Standard项目版本为2.0
  • System.Reactive的版本为4.0.0-preview00001

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM