2013-01-17 14 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