MVVMメモ2 責務分割と実行スレッド

非同期処理の実行開始(別スレッドの作成)はModel

非同期処理中にViewを変更するのに必要なデータを取得した場合イベントでViewModelに戻す。
Viewを変化させる必要がない場合はModel内で全てを処理しViewModelには戻さない。

Viewの変更のために呼び出されたViewModelの関数(別スレッド)で
Control.BeginInvoke()またはDispather.BeginInvoke()等を用い
Viewを変更する処理(Binding or Messenger)をUIスレッドで実行するよう登録する
(Invoke()メソッドを使うとフリーズする可能性があるので注意)

別スレッドからBeginInvoke経由で呼び出された処理(ViewModel)でBindingもしくはMessengerを用いてViewを変更する

非同期処理の終了(別スレッドの停止)はModelで行う
時間経過による自然終了・UIの操作等による強制終了の可能性があるが、どちらも最終的にはModelが行う

———————————
別スレッドの作成がModelで
別スレッドからUIスレッドにデータを移すのはViewModelなのが非対称に感じるかもしれないが、
スレッドの作成に対応するのはスレッドの終了であって、データのUIへの伝達ではない。

また、別スレッドの作成(非同期処理の開始)をViewModelで行おうとすると
非同期処理の結果ががViewの変更を伴わなくてもViewModelで処理を行う必要が出てくるため責務の分割が崩れ

別スレッド→UIスレッドのデータ転送をModelで行おうとするとUIスレッドを表すオブジェクトをModelで用いる必要があり、
そのUIスレッドを表すオブジェクトの型はプラットフォームにより異なる(WinFormsならControlクラス、WPF等ではDispatherクラス)ため
Modelがプラットフォームに依存してしまう

 

広告

akatukisiden について

フリーランスプログラマ 使用言語はC++,C#とそのつなぎのC++/CLI 専門はクライアントアプリ開発
カテゴリー: C#, MVVM タグ: , , , , , , , パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中