在.NET标准库中访问调度程序IScheduler
This question描述如何确保IObservable<>.Throttle
通过将UI调度程序传递到Throttle
而在UI线程上运行。但是,我的观察对象是在基于.NET Standard 1.5的共享库中定义的。在.NET标准中是否有等效的DispatcherScheduler.Instance
或者我应该从使用(WPF/UWP/etc)库注入调度程序?在.NET标准库中访问调度程序IScheduler
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
感谢您的回答。它已经有一段时间了,但是从记忆来看,我采用了类似的方法,并将上下文传递给观察者。 –
是的,你应为所有WPF/UWP代码使用调度调度程序。 – Enigmativity
@Enigmativity DispatcherScheduler.Instance在.NET标准项目中找不到。我只是比较了WPF和.NET标准项目中的System.Reactive 4.0(pre)。 WPF仍然知道DispatcherScheduler.Instance,.NET标准没有。 –