许多命令/事件(除了少量纯对象更改之外的几乎所有内容)需要以非阻塞方式运行以阻止应用程序冻结。
解锁代码(Background Worker/Task/etc.)通常应该放在模型、视图模型还是视图中?
许多命令/事件(除了少量纯对象更改之外的几乎所有内容)需要以非阻塞方式运行以阻止应用程序冻结。
解锁代码(Background Worker/Task/etc.)通常应该放在模型、视图模型还是视图中?
任务应该在 ViewModel 或 Model 中异步启动,当然不是在 View 中。
我会将其作为与上下文相关的决定。某些事物的异步计算是否是业务逻辑的内在特征,在业务逻辑中具有复杂的相互依赖关系?然后将“解锁代码”放入模型中。然后,您需要实现相应的事件以在任务完成时通知您的 ViewModel,或者更一般地说,您的模型已更改(作为旁注:在模型上实现 INotifyPropertyChanged 在这里是完全合法的)。
如果你想保持你的模型没有异步的东西,从 ViewModel 启动它。但是,当您异步修改模型时,您必须非常小心,以免遇到问题。我会锁定它。
顺便说一句:看看任务并行库。你可以为这样的命令编写一个 Execute() 方法:
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
return expensiveTaskResults();
}).ContinueWith(t =>
{
if (t.IsFaulted) HandleError(t);
Result = t.Result;
}
很好很简单。
这可能会提供更多信息:SO Thread
据我所知,您也可以在命令和视图模型中使用异步工具(Backworker、Thread/Task ..),但不能在模型中使用。看看这篇文章
MVVM 中很少涉及事件,尤其是在实现业务逻辑时,因为除非您使用事件到命令工具,否则它们不能与 ViewModel 有直接关系。