質問: $"Number: {i++}"; } catch(Exception e) { Trace.WriteLine(e.Message); } Thread.Sleep(100); } }); ``` この場合、Messageへの代入の時に例外が出ると想定していたのですが 問題なく代入でき、UI上でも値が更新されます。 ReactivePropertyには自動ディスパッチ機能があると思いますが ReadOnlyReactivePropertySlimにはそのような機能が無いものと思っています。 UI スレッドへのイベントの自動ディスパッチ (Slim には無い機能) なぜ、非UIスレッドからのプロパティ変更が出来ているのでしょうか。
回答: WPFは`INotifyPropertyChanged.PropertyChanged`イベントをメインスレッド(UIスレッド)に自動的にディスパッチしてくれるようになっているため、バインディングソースをサブスレッド(非UIスレッド)で直接操作しても、問題なく動作するようになっています。 ただしSilverlightやUWP (WinRT) ではそういった仕組みがないため、UIスレッドにディスパッチする処理をアプリケーションサイドで記述する必要があります。 * MVVM - MVVM アプリにおけるマルチスレッドとディスパッチ | Microsoft Docs その他、WPF 4.5以降では、`BindingOperations.EnableCollectionSynchronization()`メソッドを使用することで、バインディングソースに指定したコレクションをサブスレッドで直接操作することもできるようになっています。こちらもSilverlightやUWPでは使えません。 * What's New in WPF Version 4.5 | Microsoft Docs * マルチスレッドとWPF 4.5 | InfoQ * WPF:DataGridやListViewなどに表示しているデータを別スレッドから変更するには?[C#、VB]:.NET TIPS - @IT