谁应该在MVC中处理线程?

cas*_*nca 4 model-view-controller multithreading

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

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

// Option 1

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

public class Controller {
  public void DoSomething() {
    model.Foo();
  }
}
Run Code Online (Sandbox Code Playgroud)

要么:

// Option 2

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

public class Controller {
  public void DoSomething() {
    RunAsync(() => model.Foo());
  }
}
Run Code Online (Sandbox Code Playgroud)

这样或那样做是否有优势?

djn*_*jna 5

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

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