当前位置: 首页 > 编程语言 > C#

async-await在MVVM中没用?分享

时间:2023-04-10 21:12:27 C#

async/await在MVVM中没用吗?在MVVM中,ViewModels通过INotifyPropertyChanged事件更新视图,async/await的酷炫似乎没有太多空间;在调用者捕获的同步上下文中继续执行。那么,如果是这种情况,谁会在现代基于UI的应用程序中实际使用异步/等待功能?在这种情况下,“谁”也可以表示什么样的模式,例如MVC更改。我认为以下是使用TAPViewModel.Age{set{awaitModel.SetAge(value);的好方法NotifyPropertyChanged("年龄");然而,在捕获的syncContext上运行它并没有多大帮助。事实上,我们可以将所有这些都放在模型中。Model.Age{set{awaitSetAge(value);NotifyPropertyChanged("年龄");现在,我们真的希望syncContext是非捕获的。事实上,数据绑定需要在UI同步上下文中引发INotifyPropertyChanged.PropertyChanged。async/await强制您区分属性(表示当前状态并且始终同步)和命令(表示操作,可以是同步的或异步的)。属性getter和setter不能是异步的,因此带有“asyncset”的示例代码不是一种可能的方法。async启用异步命令。您可以使用命令绑定异步处理路由命令,或将异步委托传递给DelegateCommand,或使用您自己的ICommand实现。无论采用哪种方式,最终都会得到一个asyncvoid命令事件处理程序。一个现实的例子是让VM属性在内存中设置M属性,并使用带有异步处理程序的SaveCommand。让异步处理程序与其他VM属性(SaveInProgress或者可能是与其他异步处理程序共享的公共Busy)交互是很常见的,这样UI就可以在命令进行时做出适当的响应(通常至少会导致CanExecute返回false).所以你的异步处理程序最终看起来像:privateasyncvoidSaveCommandExecute(){try{//SetVMproperty;适当地更新视图。忙=真;//异步进行实际保存。等待Model.SaveAsync();}catch(Exceptionex){//使用错误信息更新VM。错误=ex.Message;}finally{//让虚拟机知道我们完成了。忙=假;}}privatevoidSaveCommandCanExecute(){返回!忙碌的;请注意,VM属性(Error和Busy)在捕获的UI同步上下文中更新。这说明了异步MVVM的核心概念:命令可能是异步的,但属性(如Busy)始终代表当前状态。如果您要将异步添加到现有的MVVM应用程序,您会发现自己有几个额外的属性指示业务和可能的进度更新(例如,完成百分比)。根据您的应用程序,您可以同时允许多个异步操作。您需要考虑一种将此信息添加到您的视图中的好方法;我发现这是异步MVVM应用程序中最具挑战性的部分。以上是C#学习教程:async/await在MVVM中没用吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: