2017-10-21 13 views
3

This questionは、UIスケジューラをThrottleに渡すことで、UIスレッドでIObservable<>.Throttleが実行されるようにする方法を説明しています。しかし、Observablesは.NET Standard 1.5に基づいた共有ライブラリに定義されています。 .NET StandardにDispatcherScheduler.Instanceと同等のものがありますか?または、消費する(WPF/UWP/etc)ライブラリからスケジューラを注入する必要がありますか?.NET StandardライブラリのDispatcher ISchedulerにアクセス

+0

を持ってはい、すべてのWPF/UWPコードに対してディスパッチスケジューラを使用する必要があります。 – Enigmativity

+0

@Enigmativity DispatcherScheduler.Instanceは.NET標準プロジェクトでは見つかりません。私はSystem.Reactive 4.0(pre)をWPFと.NETの標準プロジェクトで比較しました。 WPFはDispatcherScheduler.Instanceを認識していますが、.NET標準はそうではありません。 –

答えて

1

クラスDispatcherSchedulerは.NET StandardのSystem.Reactiveアセンブリに存在しません。

可能な回避策は、現在のSynchronizationContextSynchronizationContextSchedulerを使用することです。 ObserveOn()が呼び出されたときにUIスレッドを使用している場合、オブザーバブルのハンドラはUIスレッド上で実行されます。

ObserveOn()がUIスレッドで呼び出されていない場合、すべてが機能しません。この場合を避けるには、AppContextオブジェクトを作成し、UIの初期化が行われている間にそのオブジェクトを設定し、アプリケーションで配布可能にします。このAppContextの中にSynchronizationContext.Currentを保存して、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 
}); 

は、私は私が上のviewmodels、ビューとを含む.NET標準2.0でアプリのプロジェクトを持っているXamarin.Forms 2.5.0プロジェクト、このようにそれを使用しています。

この回答は、(少なくとも)この条件の下で有効です。

  • .NET標準プロジェクトのバージョンである2.0
  • System.Reactiveはバージョン4.0.0-preview00001
+0

答えをありがとう。それはしばらくしていましたが、私は同様のアプローチをしてオブザーバーに文脈を渡しました。 –

関連する問題