2017-10-21 114 views
3

This question描述如何确保IObservable<>.Throttle通过将UI调度程序传递到Throttle而在UI线程上运行。但是,我的观察对象是在基于.NET Standard 1.5的共享库中定义的。在.NET标准中是否有等效的DispatcherScheduler.Instance或者我应该从使用(WPF/UWP/etc)库注入调度程序?在.NET标准库中访问调度程序IScheduler

+0

是的,你应为所有WPF/UWP代码使用调度调度程序。 – Enigmativity

+0

@Enigmativity DispatcherScheduler.Instance在.NET标准项目中找不到。我只是比较了WPF和.NET标准项目中的System.Reactive 4.0(pre)。 WPF仍然知道DispatcherScheduler.Instance,.NET标准没有。 –

回答

1

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

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

ObserveOn()未在UI线程上调用时,整件事情都不起作用。为了避免这种情况,您可以创建类似于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 2.0标准包含的ViewModels,意见等这样使用它。

这个答案是有效的(至少)此条件下:

  • .NET标准项目版本是2.0
  • System.Reactive具有版本4.0.0-preview00001
+0

感谢您的回答。它已经有一段时间了,但是从记忆来看,我采用了类似的方法,并将上下文传递给观察者。 –