かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

ReactivePropertyで自動でUIスレッドにイベント発行を変えるのを抑止する

普通はいいんですが、UWPとかでマルチウィンドウとか、共有コントラクトとか使うとUIスレッドが複数生成されて、UIスレッドが1つという前提に立ってるReactivePropertyだと、ちょっと嫌な感じになってしまいます。

そんなときは、Appクラスの初期化処理で以下の1行を追加すると、現在のスレッドでイベントが発行されるようになります。

// 余計なスレッド切り替えは自動でしないで
ReactivePropertyScheduler.SetDefault(CurrentThreadScheduler.Instance);

あとは、ViewModelあたりで明示的にSynchronizationContext.Currentを使ってObserveOnをしてやればUIスレッドに処理を移動させたり、もしくは、明示的にSynchronizationContextSchedulerを使ってReactiveProperty関係のクラスを作ればいいです。(明示的にSchedulerを指定する場合は、別にReactivePropertyScheduler.SetDefaultしなくても大丈夫。

// 現在のVMが今のUIスレッドでインスタンス化されること前提
this.Time = new ReactiveProperty<string>(new SynchronizationContextScheduler(SynchronizationContext.Current));