4

通常、実行時間の長いタスクはバックグラウンド スレッドで実行され、UI がフリーズしないようにします。スレッド化ロジックは、ビューまたはコントローラーのいずれかに存在する可能性があるようです。

RunAsync例として (C# の場合)、バックグラウンド スレッドでデリゲートを実行するという名前のメソッドがあるとします。これを行う 2 つの方法を次に示します。

// Option 1

public class View {
  public void OnButtonClicked() {
    RunAsync(() => controller.DoSomething());
  }
}

public class Controller {
  public void DoSomething() {
    model.Foo();
  }
}

また:

// Option 2

public class View {
  public void OnButtonClicked() {
    controller.DoSomething();
  }
}

public class Controller {
  public void DoSomething() {
    RunAsync(() => model.Foo());
  }
}

いずれかの方法でそれを行う利点はありますか?

4

3 に答える 3

5

コントローラがスレッド セーフの責任を負うという 2 つの議論があります。

  1. コントローラーは (少なくとも概念的には) 多くのビューで再利用可能です。繰り返しは避けますが、RunAsync() を多くのビューではなくコントローラーに配置します。
  2. そのようなスレッド化が必要かどうかを実際に「知っている」のはコントローラーだけです。実際、将来的にコントローラーを変更する可能性があります。ですから、私たちは「単一責任」の考え方を持っています。コントローラーは、RunAsynch() が必要かどうかを決定し、実際にそれが行われたことを確認します。
于 2012-07-10T06:45:58.930 に答える
1

私の理解では、Controller(または WPF の ViewModel)がこれを処理する必要があります。ビューは常に「ビュー」関連のものと結合することを意図しているため、バックグラウンド ジョブの実行などのタスクはコントローラーに送信する必要があります。

VIEW がこのロジックを処理する必要があるのは奇妙に聞こえませんか?

于 2012-07-10T06:46:28.753 に答える
1

私の意見では、それはコントローラーによって処理されるべきです。可能な限りモデルをビューから分離したいので、実際にはビューは、 のような特定の呼び出しにmodel.Foo()時間がかかり、非同期で実行する必要があることを認識してはなりません。一方、コントローラは実際に両方の知識を持っている唯一のコントローラであるため、一部の操作を非同期で実行する必要があるかどうかを決定する必要があります。

于 2012-07-10T06:51:08.127 に答える