2013-01-17 28 views
1

需要以非阻塞的方式運行許多命令/事件(除了少量純粹的對象更改外),以阻止應用程序凍結。在mvvm中放置異步/解除阻塞的位置?

解除阻塞的代碼(Background Worker/Task/etc。)是否應該放在模型,視圖模型或視圖中?

+0

在MVVM中沒有控制器。 –

回答

1

據我所知,您可以在您的Commands和ViewModels中使用異步工具(Backworker,Thread/Task ..),但不能在您的模型中使用。看看這個article
事件很少涉及MVVM,尤其是在實現業務邏輯時,因爲它們不能與ViewModel直接相關,除非使用Events to Commands工具。

+0

通過事件我的意思是提高事件,如點擊,而不是使用命令,並從視圖調用視圖模型/模型方法,他們沒有直接的關係,但你仍然可以把異步在底層(但是一個好主意是我問的)。 –

+0

通過了解每個模式成員的角色,您可以定義什麼聽起來不錯,什麼不是。所提供的鏈接將幫助你。 – HichemSeeSharp

1

任務應該在ViewModel或Model中異步啓動,當然不是在View中。

我會把它作爲一個背景相關的決定。在業務邏輯中,異步計算某些業務邏輯的內在特徵是否具有複雜的相互依賴關係?然後將「解鎖代碼」放入模型中。那麼當任務完成時,或者更一般地說,你的模型已經改變(作爲一個方面:在模型上實現INotifyPropertyChanged在這裏是完全合法的),你需要實現accoridng事件來通知你的ViewModel。

如果你想保持你的模型清潔異步的東西,從ViewModel啓動它。但你必須非常小心,不要遇到問題,當你異步修改你的模型。我會鎖定它。

順便說一句:看看任務並行庫。你可以這樣寫一個Execute()方法:

System.Threading.Tasks.Task.Factory.StartNew(() => 
{     
    return expensiveTaskResults(); 
}).ContinueWith(t => 
{ 
    if (t.IsFaulted) HandleError(t);     
    Result = t.Result; 
} 

不錯,簡單。

這可能會提供更多信息:SO Thread

+0

爲什麼不在視圖中? –

+2

因爲你想保持你的視圖清潔任何不是視圖...異步做東西肯定是可能很複雜的東西,你想測試等等......視圖應該既不關心在幕後執行什麼任務,也不怎麼樣。你想做什麼,是如何做的一部分?問題,我會說。 – Marc