Multithreading 谁应该在MVC中处理线程?

Multithreading 谁应该在MVC中处理线程?,multithreading,model-view-controller,Multithreading,Model View Controller,长时间运行的任务通常在后台线程中执行,以防止UI冻结。线程逻辑似乎可以驻留在视图或控制器中 例如(在C#中),假设有一个名为RunAsync的方法在后台线程中运行委托,下面是两种方法: // Option 1 public class View { public void OnButtonClicked() { RunAsync(() => controller.DoSomething()); } } public class Controller { public

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

例如(在C#中),假设有一个名为
RunAsync
的方法在后台线程中运行委托,下面是两种方法:

// Option 1

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

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


这样做有好处吗?

我认为控制器有两个理由负责线程安全

  • 控制器(至少在概念上)可由许多视图重用。我们避免重复自己的操作,而是将RunAsync()放在控制器中,而不是放在许多视图中
  • 只有控制器真正“知道”是否需要这样的线程。事实上,我们将来可能会更换控制器。所以我们有一种“单一责任”的思维方式。控制器决定是否需要RunAsynch(),并实际确保已完成
    我的理解是控制器(或WPF中的ViewModel)应该处理这个问题。 视图总是与“视图”相关的内容结合在一起,因此运行后台作业之类的任务应该交给控制器


    视图应该处理这个逻辑,这听起来不是很奇怪吗?

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

    你完全正确——只有控制器“知道”何时需要线程。为什么我没有想到这一点?:)其他答案似乎也一致;我接受这个,因为这是第一个答案。
    // Option 2
    
    public class View {
      public void OnButtonClicked() {
        controller.DoSomething();
      }
    }
    
    public class Controller {
      public void DoSomething() {
        RunAsync(() => model.Foo());
      }
    }