2017-10-21 78 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

感謝您的回答。它已經有一段時間了,但是從記憶來看,我採用了類似的方法,並將上下文傳遞給觀察者。 –