2012-07-10 86 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