2012-07-10 65 views
3

长时间运行的任务通常在后台线程中执行,以防止UI冻结。看起来线程逻辑可以驻留在视图或控制器中。谁应该在MVC中处理线程?

为例(在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()); 
    } 
} 

以某种方式做这件事有没有优势?

回答

4

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

  1. 控制器(至少在概念上)可以被许多视图重复使用。我们避免重复自己,但将RunAsync()放入控制器而不是许多视图中。
  2. 只有Controller真的“知道”是否需要这样的线程。事实上,我们可能会在未来改变控制器。所以我们有一个“单一责任”的思维方式。控制器既决定是否需要RunAsynch(),也确定它是否完成。
+0

你是绝对正确的 - 只有控制器“知道”什么时候需要线程。我为什么没有想到这个? :) – casablanca 2012-07-10 06:55:34

+0

看来其他答案也一致;我接受这个,因为这是第一个答案。 – casablanca 2012-07-10 06:56:36

1

我的理解是控制器(或WPF中的ViewModel)应该处理这个。 视图始终与'VIEW'相关的东西结合在一起,因此像运行后台作业这样的任务应该发送给控制器。

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

1

在我看来,它应该由控制器来处理。既然你想尽可能地将模型从视图中分离出来,实际上视图应该不知道诸如model.Foo()之类的特定调用需要很长时间,因此需要异步运行。另一方面,Controller是唯一真正了解这两者的人,因此应该决定是否需要异步运行一些操作。

+0

+1这很有意义。 – casablanca 2012-07-10 06:56:26