コマンド/イベントの多く (少量の純粋なオブジェクトの変更以外のほぼすべて) は、アプリケーションがフリーズするのを防ぐために、非ブロッキング方式で実行する必要があります。
ブロック解除コード (バックグラウンド ワーカー/タスク/など) は、通常、モデル、ビューモデル、またはビューに配置する必要がありますか?
コマンド/イベントの多く (少量の純粋なオブジェクトの変更以外のほぼすべて) は、アプリケーションがフリーズするのを防ぐために、非ブロッキング方式で実行する必要があります。
ブロック解除コード (バックグラウンド ワーカー/タスク/など) は、通常、モデル、ビューモデル、またはビューに配置する必要がありますか?
私の知る限り、コマンドとビューモデルでも非同期ツール(バックワーカー、スレッド/タスク..)を使用できますが、モデルでは使用できません。この記事
を見てください。Events to Commands ツールを使用しない限り、イベントは ViewModel と直接関係を持つことができないため、特にビジネス ロジックの実装では、MVVM にイベントが関与することはめったにありません。
タスクは、ViewModel または Model のいずれかで非同期に開始する必要がありますが、View で開始する必要はありません。
私はそれを文脈に関連した決定にします。何かの非同期計算は、ビジネス ロジック内で複雑な相互依存関係を持つビジネス ロジックの本質的な機能ですか? 次に、「ブロック解除コード」をモデルに入れます。次に、タスクが完了したとき、またはより一般的に言えば、モデルが変更されたときに ViewModel に通知するために、according イベントを実装する必要があります (補足として、モデルに INotifyPropertyChanged を実装することはここでは完全に正当です)。
モデルを非同期のものからきれいに保ちたい場合は、ViewModel から開始します。ただし、モデルを非同期的に変更する場合は、問題が発生しないように十分に注意する必要があります。私はそれをロックします。
ところで:Task Parallel Libraryを見てください。次のようなコマンドの Execute() メソッドを作成できます。
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
return expensiveTaskResults();
}).ContinueWith(t =>
{
if (t.IsFaulted) HandleError(t);
Result = t.Result;
}
素敵でシンプル。
これにより、さらに多くの情報が得られる可能性があります: SO スレッド