runceel / ReactiveProperty

ReactiveProperty provides MVVM and asynchronous support features under Reactive Extensions. Target frameworks are .NET 6+, .NET Framework 4.7.2 and .NET Standard 2.0.
MIT License
903 stars 101 forks source link

AsyncReactiveCommand の CanExecuteを別スレッドから変更すると、「'このオブジェクトは別のスレッドに所有されているため、呼び出しスレッドはこのオブジェクトにアクセスできません。」の例外が発生する。 #382

Closed kenichi-kobayashi closed 2 years ago

kenichi-kobayashi commented 2 years ago

いつもお世話になってます。

以下の現象がありましたので、報告させてください。

■現象 AsyncReactiveCommand の CanExecuteを別スレッドから変更すると、「'このオブジェクトは別のスレッドに所有されているため、呼び出しスレッドはこのオブジェクトにアクセスできません。」の例外が発生しました。

■詳細

・Textプロパティを用意する。 ・TextプロパティがNullOrEmptyでなければ、実行可能なコマンドを用意する。 ・ReactiveCommandと、AsyncReactiveCommandの2つのコマンドを用意する。 ・画面では、Buttonに2つのコマンドをBindする。 ・TextプロパティをUIスレッド以外から変更する。 ・AsyncReactiveCommandだけが例外となる。

image

ReactivePropertyUIThread.zip

これは、仕様でしょうか?

よろしくお願いいたします。

runceel commented 2 years ago

仕様になります。 ObserbeOn で UI スレッドに手動で切り替えてください。

UI スレッドへのイベントの自動ディスパッチ機能は ReactiveProperty/ReadOnlyReactiveProperty/ReactiveCommand のみになります。 自動ディスパッチは便利なのですが、わかりにくい挙動も引き起こすため AsyncReactiveCommand や ReactivePropertySlim/ReadOnlyReactivePropertySlim にはありません。

kenichi-kobayashi commented 2 years ago

いつも、即レスに感謝です。

そういう仕様ということで、理解しました!