访问.NET标准库中的Dispatcher IScheduler

时间:2017-10-21 02:39:38

标签: c# .net system.reactive .net-standard

This question描述了如何通过将UI调度程序传递给IObservable<>.Throttle来确保{1}在UI线程上运行。但是,我的Observable是在基于.NET Standard 1.5的共享库中定义的。 .NET Standard中是否有等效的Throttle,还是应该从使用(WPF / UWP / etc)库中注入调度程序?

1 个答案:

答案 0 :(得分:2)

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

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

当在UI线程上没有调用ObserveOn()时,整个事情都不起作用。为了避免这种情况,您可以创建类似AppContext对象的东西,在UI初始化发生时进行设置,并使其在您的应用程序中可分发。将SynchronizationContext.Current保存在此AppContext中,您可以在拥有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标准项目版本为2.0
  • System.Reactive的版本为4.0.0-preview00001