简单的wpf mvvm异步示例

时间:2013-05-31 21:23:12

标签: wpf task-parallel-library async-await

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

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

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

1 个答案:

答案 0 :(得分:4)

以下是我对async MVVM项目的建议:

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

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

我在async and constructors上有一篇博文;我推荐用于虚拟机的“异步初始化”技术(与IoC兼容)。

我还在async and properties上发了一篇博客文章;有几种方法,包括异步延迟初始化(用于共享资源)和更新数据绑定属性。这两篇博客文章都是async OOP series的一部分,但这两篇文章特别为虚拟机提供了有用的信息。

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

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

请注意,SimpleAsyncCommandAsyncCommand尚未成为AsyncEx的一部分,因此您必须将源代码复制/粘贴到您自己的项目中才能使用它们。