4

长时间运行的任务通常在后台线程中执行,以防止 UI 冻结。似乎线程逻辑可以驻留在视图或控制器中。

举个例子(在 C# 中),假设有一个名为的方法RunAsync在后台线程中运行委托,这里有两种方法:

// 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

我看到控制器负责线程安全的两个论点。

  1. 控制器(至少在概念上)可被许多视图重用。我们避免重复自己,而是将 RunAsync() 放在 Controller 中而不是许多 View 中。
  2. 只有控制器真正“知道”是否需要任何这样的线程。事实上,我们将来可能会更改控制器。所以我们有一个“单一责任”的思维方式。控制器既决定是否需要 RunAsynch() 并且实际上确保它完成。
于 2012-07-10T06:45:58.930 回答
1

我的理解是控制器(或 WPF 中的 ViewModel)应该处理这个问题。视图总是与“视图”相关的东西相结合,因此像运行后台作业这样的任务应该交给控制器。

VIEW 应该处理这个逻辑对你来说听起来不是很奇怪吗?

于 2012-07-10T06:46:28.753 回答
1

在我看来,它应该由Controller处理。由于您希望尽可能地将模型与视图分开,因此视图实际上应该不知道特定调用(例如)model.Foo()需要很长时间,因此需要异步运行。另一方面,控制器是唯一真正了解两者的控制器,因此应该决定某些操作是否需要异步运行。

于 2012-07-10T06:51:08.127 回答