1

我有非常简单的宁静服务来处理我的 wpf 应用程序的所有数据请求。我知道最佳实践表明从 UI 线程中获取那些长时间运行的请求。

我正在使用 .NET 4.5,因此我可以利用一些较新的工具,async/await,TPL。我已经创建了一些示例项目,并且我理解了这个概念。我似乎无法掌握的问题是处理视图模型中的异步内容。在我的示例项目中,异步工作总是发生在代码隐藏中 - 很容易。一旦将其抽象为视图模型-我就会丢失它。

我有一个非常简单的泛型类来处理我所有的其余网络请求。理想情况下,我希望异步工作在那里发生。

4

1 回答 1

4

以下是我对asyncMVVM 项目的推荐:

  • 将您的 VM 视为具有 UI 亲和力。
  • 异步方法通常用于初始化和命令。
  • 属性只代表当前状态。如果您发现自己试图实现“异步属性”,请重新评估您的设计。

话虽如此,有些技巧可能对您有所帮助(所有这些都是指向我的博客或我的 AsyncEx 库的链接)。

我有一篇关于异步和构造函数的博文;“异步初始化”技术(与 IoC 兼容)是我为 VM 推荐的技术。

我还有一篇关于异步和属性的博文;有几种方法,包括异步延迟初始化(用于共享资源)和更新数据绑定属性。这两篇博文都是异步 OOP 系列的一部分,但这两篇博文尤其具有对 VM 有用的信息。

异步初始化和异步属性加载都可以使用我编写的辅助类型NotifyTaskCompletion,它本质上只是观察一个任务并为该任务提供一些数据可绑定的属性。

对于异步命令 ( ICommand),您可以从 开始SimpleAsyncCommand,它类似于async DelegateCommand. 更高级的类型是,它支持取消、进度报告,并且只要命令已经在执行AsyncCommand,就默认实现CanExecuteChanged返回。false

请注意,SimpleAsyncCommand并且AsyncCommand还不是 AsyncEx 的一部分,因此您必须将源代码复制/粘贴到您自己的项目中才能使用它们。

于 2013-05-31T22:21:44.303 回答