在哪里把异步/unblocking在mvvm

本文关键字:mvvm unblocking 异步 在哪里 | 更新日期: 2023-09-27 17:53:44

许多命令/事件(除了少量纯对象更改之外的所有内容)需要以非阻塞方式运行,以防止应用程序冻结。

解除阻塞的代码(后台工作/任务/等)应该在模型,视图模型,或视图?

在哪里把异步/unblocking在mvvm

据我所知,你可以在你的命令和视图模型中使用异步工具(Backworker,Thread/Task ..),但不是在你的模型中。看看这篇文章
事件很少涉及到MVVM,特别是在实现业务逻辑时,因为它们不能与ViewModel有直接关系,除非您使用事件到命令工具。

任务应该在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线程