WPFでMVVMで設計しています。
GUI以外の部分はなるべく裏で行いたいと思い、Model,ViewModelを別スレッドで実行したいと考えています。
この場合、どの辺りから別スレッドの切り替えをしたらよいか悩んでいます。
操作から反応までの流れを以下のように考えてみました。
GUI(window)->ICommand->ViewModel(Model)->INotityPropertyChanged->GUI(Window)
ICommand~INotifyPropertyChangedまでの間を別スレッドとして走らせています。
この時INotifyPropertyChangedの発行が裏スレッドで行われるので、UIスレッドで実行する必要があります。
この切り替えをViewModel側で行うか、GUIで行うかというところで悩んでいます。
ViewModel側で行う場合
○Taskの管理をViewModel内部で完結することが出来る
×Modelの階層が複数ある場合(例えば子供にもINotifyPropertyChangedがあり、連動したい場合)、全部の通知に介入しないとならない
→TaskScheduler(UIスレッド)をModelに渡す必要が出てくる
C#
1//ViewModelのイベント発行側 2public string text; 3public string Text 4{ 5 get 6 { 7 return text; 8 } 9 set 10 { 11 text = value; 12 Task.Factory.StartNew(() => 13 { 14 PropertyChanged(this, new PropertyChangedEventArgs(nameof(Text)); 15 }, CancellationToken.None, TaskCreationOptions.None, uiThread); //UIスレッドで実行 16 } 17} 18
GUI(Window)側で行う場合
○ViewModel側にTaskSchedulerなどの不要情報が入らない
○イベント通知がシンプルに渡せる
×Window側のイベントハンドラがどのスレッドが分かりにくくなる
C#
1//Windowのイベントハンドラ 2private void ViewModel_PropertyChanged(object sender, ProperyChangedEventArgs e) 3{ 4 Task.Factory.StartNew(() => 5 { 6 //結果の描画など 7 }, CancellationToken.None, TaskCreationOptions.None, uiThread); //UIスレッドで実行 8}
イマイチどちらもスッキリしません。
もしかしたらスレッドの実行のさせ方に問題があるのかもしれません。
いい方法などありましたらご教示ください。
回答1件
あなたの回答
tips
プレビュー