谁应该在MVC中处理线程?

时间:2012-07-10 06:35:21

标签: multithreading model-view-controller

长时间运行的任务通常在后台线程中执行,以防止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());
  }
}

以某种方式做到这一点是否有优势?

3 个答案:

答案 0 :(得分:5)

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

  1. 控制器(至少在概念上)可以被许多视图重用。我们避免重复自己,但将RunAsync()放在Controller中,而不是放在很多视图中。
  2. 只有Controller真正“知道”是否需要任何此类线程。实际上我们将来可能会改变控制器。所以我们有一种“单一责任”的思维方式。控制器都决定是否需要RunAsynch()并确保它完成。

答案 1 :(得分:1)

我的理解是Controller(或WPF中的ViewModel)应该处理这个问题。 View始终与“VIEW”相关的东西相结合,因此运行后台作业等任务应该转到控制器。

对你来说VIEW应该处理这个逻辑并不奇怪吗?

答案 2 :(得分:1)

在我看来,它应由财务主任处理。由于您希望尽可能地将Model与View分开,因此View应该不知道model.Foo()之类的特定调用需要很长时间,因此需要异步运行。另一方面,Controller是唯一真正了解这两者的人,因此应该决定某些操作是否需要异步运行。