Multithreading 谁应该在MVC中处理线程?
长时间运行的任务通常在后台线程中执行,以防止UI冻结。线程逻辑似乎可以驻留在视图或控制器中 例如(在C#中),假设有一个名为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
RunAsync
的方法在后台线程中运行委托,下面是两种方法:
// Option 1
public class View {
public void OnButtonClicked() {
RunAsync(() => controller.DoSomething());
}
}
public class Controller {
public void DoSomething() {
model.Foo();
}
}
或:
这样做有好处吗?我认为控制器有两个理由负责线程安全
我的理解是控制器(或WPF中的ViewModel)应该处理这个问题。 视图总是与“视图”相关的内容结合在一起,因此运行后台作业之类的任务应该交给控制器
视图应该处理这个逻辑,这听起来不是很奇怪吗?在我看来,它应该由控制器处理。由于您希望尽可能地将模型与视图分开,因此视图实际上应该不知道诸如
Model.Foo()
之类的特定调用需要很长时间,因此需要异步运行。另一方面,控制器是唯一真正了解这两方面的人,因此应该决定是否需要异步运行某些操作。你完全正确——只有控制器“知道”何时需要线程。为什么我没有想到这一点?:)其他答案似乎也一致;我接受这个,因为这是第一个答案。
// Option 2
public class View {
public void OnButtonClicked() {
controller.DoSomething();
}
}
public class Controller {
public void DoSomething() {
RunAsync(() => model.Foo());
}
}