【发布时间】:2012-11-09 08:00:39
【问题描述】:
在 ViewModel 通过 INotifyPropertyChanged 事件更新 View 的 MVVM 中,async/await 的酷特性似乎没有太多空间;在调用者捕获的同步上下文上执行延续。
那么,如果是这样,那么谁会在基于现代 UI 的应用程序中真正使用 async/await 的功能呢?在这种情况下,“谁”也可以表示什么模式,例如MVC 变体。
我认为以下是使用 TAP 的好方法
ViewModel.Age
{
set {
await Model.SetAge(value);
NotifyPropertyChanged("Age");
}
}
然而,在捕获的 syncContext 上运行它并没有太大帮助。 实际上,我们可以将所有这些都放在模型中。
Model.Age
{
set {
await SetAge(value);
NotifyPropertyChanged("Age");
}
}
现在,我们真的不希望同步上下文成为捕获的对象。
【问题讨论】:
-
基于任务的异步模式,但实际上我只是指 C#5 中的 async/await 功能。
-
为什么没用?你可以等待各种不同的事情。更新 UI、获取数据、监听消息...
-
这将是无用的,因为在 MVVM 中不需要在调用上下文上执行回调的整个功能,因为更新是通过事件完成的。
-
那些需要执行大量工作然后更新属性的命令呢?
-
所谓的空间不足从何而来?与其在阻止 UI 线程的同时做一些需要一段时间的事情,不如释放 UI 线程并在其他地方完成工作。它与使用工作池没有什么不同,但更容易编写,并且你可以说出你的延续必须在哪里执行。而且您已经在使用事件来通知 UI。