谁应该处理在MVC线程?(Who should handle threading in MVC?)

2019-06-26 04:13发布

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

是否有优势,做一个或其他方式?

Answer 1:

我看到两个参数对具有线程安全的责任控制器。

  1. 所述控制器(至少在概念上)由许多视图可重复使用的。 我们避免重复自己,而且把RunAsync()的控制器,而不是很多意见。
  2. 只有真正的控制器“知道”是否需要任何这样的线程。 事实上,我们可能会改变未来的控制器。 因此,我们必须思考的一个“单一职责”的方式。 该控制器既决定RunAsynch()是否需要和actualy确保它完成。


Answer 2:

我的理解是控制器(或视图模型在WPF)应对此进行处理。 查看被一直打算要加上“VIEW”有关的东西,这样的任务,如运行的后台作业应该去控制器。

那岂不是很奇怪,你视图应该处理这个逻辑是什么?



Answer 3:

在我看来,它应该由控制器来处理。 既然你想从视图模型尽可能分开,真正的视图应该不知道,这样一个特定的呼叫model.Foo()需要很长的时间,因此需要进行异步运行。 在另一方面控制器是真的有两方面的知识,因此应就一些操作是否需要异步运行的决定只有一个。



文章来源: Who should handle threading in MVC?