1

コマンド/イベントの多く (少量の純粋なオブジェクトの変更以外のほぼすべて) は、アプリケーションがフリーズするのを防ぐために、非ブロッキング方式で実行する必要があります。

ブロック解除コード (バックグラウンド ワーカー/タスク/など) は、通常、モデル、ビューモデル、またはビューに配置する必要がありますか?

4

2 に答える 2

1

私の知る限り、コマンドとビューモデルでも非同期ツール(バックワーカー、スレッド/タスク..)を使用できますが、モデルでは使用できません。この記事
を見てください。Events to Commands ツールを使用しない限り、イベントは ViewModel と直接関係を持つことができないため、特にビジネス ロジックの実装では、MVVM にイベントが関与することはめったにありません。

于 2013-01-17T07:14:25.507 に答える
1

タスクは、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 スレッド

于 2013-01-17T07:46:29.610 に答える