This question描述了如何通过将UI调度程序传递给IObservable<>.Throttle
来确保{1}在UI线程上运行。但是,我的Observable是在基于.NET Standard 1.5的共享库中定义的。 .NET Standard中是否有等效的Throttle
,还是应该从使用(WPF / UWP / etc)库中注入调度程序?
答案 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等的应用程序项目。
在这种情况下,这个答案是有效的(至少):