As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center提供指导。
已关闭8年。
在MVVM中,ViewModels通过INotifyPropertyChanged事件更新 View ,似乎没有足够的空间容纳异步/等待功能。在捕获的调用方同步上下文上执行继续。
因此,如果是这种情况,那么谁会在基于现代UI的应用程序中实际使用async/await的功能呢?在这种情况下,“谁”还可以表示什么模式,例如MVC变体。
我可以将以下内容视为使用TAP的一种好方法
但是,在捕获的syncContext上运行此命令实际上并没有多大帮助。
实际上,我们可以将所有这些放到模型中。
现在,我们真的希望syncContext不会被捕获。
请注意,VM属性(
这说明了
如果您将
已关闭8年。
在MVVM中,ViewModels通过INotifyPropertyChanged事件更新 View ,似乎没有足够的空间容纳异步/等待功能。在捕获的调用方同步上下文上执行继续。
因此,如果是这种情况,那么谁会在基于现代UI的应用程序中实际使用async/await的功能呢?在这种情况下,“谁”还可以表示什么模式,例如MVC变体。
我可以将以下内容视为使用TAP的一种好方法
ViewModel.Age
{
set {
await Model.SetAge(value);
NotifyPropertyChanged("Age");
}
}
但是,在捕获的syncContext上运行此命令实际上并没有多大帮助。
实际上,我们可以将所有这些放到模型中。
Model.Age
{
set {
await SetAge(value);
NotifyPropertyChanged("Age");
}
}
现在,我们真的希望syncContext不会被捕获。
最佳答案
实际上,数据绑定(bind)需要在UI同步上下文中引发INotifyPropertyChanged.PropertyChanged
。async
/await
确实迫使您区分属性(代表当前状态,并且始终是同步的)和命令(代表 Action ,可以是同步的或异步的)。属性 getter 和 setter 不能是async
,因此带有“异步集”的示例代码不是可行的方法。async
启用异步命令。您可以使用命令绑定(bind)来异步处理路由命令,或者将async
委托(delegate)传递给DelegateCommand
,或者使用自己的ICommand
实现。无论采用哪种方式,最终都会得到一个async void
命令事件处理程序。
一个现实的示例是让VM属性在内存中设置M个属性,并使用带有SaveCommand
处理程序的async
。通常,让async
处理程序与其他VM属性(SaveInProgress
或与其他Busy
处理程序共享的通用async
)进行交互,以便UI可以在执行命令时做出适当的响应(通常至少导致CanExecute
返回false
)。
因此,您的async
处理程序最终看起来像:
private async void SaveCommandExecute()
{
try
{
// Set VM property; updates View appropriately.
Busy = true;
// Do the actual saving asynchronously.
await Model.SaveAsync();
}
catch (Exception ex)
{
// Update the VM with error information.
Error = ex.Message;
}
finally
{
// Let the VM know we're done.
Busy = false;
}
}
private void SaveCommandCanExecute()
{
return !Busy;
}
请注意,VM属性(
Error
和Busy
)在捕获的UI同步上下文中更新。这说明了
async
MVVM的中心概念:命令可以是async
,但是属性(例如Busy
)始终代表当前状态。如果您将
async
添加到现有的MVVM应用程序中,则会发现自己具有几个其他属性,这些属性指示业务以及进度更新(例如,完成百分比)。根据您的应用程序,您可以同时允许多个异步操作。您需要考虑将这些信息添加到 View 中的好方法;我发现这是async
MVVM应用程序中最具挑战性的部分。关于c# - 异步/等待在MVVM中没有用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13304270/