我有非常简单的restful服务来处理我的wpf应用程序的所有数据请求。我知道最佳实践表明从UI线程中获取那些长时间运行的请求。
我正在使用.NET 4.5,因此我可以使用一些较新的工具,async / await,TPL。我已经创建了一些示例项目,我理解了这个概念。我似乎无法掌握的问题是处理viewmodel中的异步内容。在我的示例项目中,异步工作总是发生在代码隐藏中 - 很容易。一旦它被抽象到视图模型 - 我就失去了它。
我有一个非常简单的泛型类来处理我的所有其他Web请求。理想情况下,我希望异步工作在那里发生。
答案 0 :(得分:4)
以下是我对async
MVVM项目的建议:
话虽如此,有些技术可能会对您有所帮助(所有这些都是指向我的博客或我的AsyncEx库的链接)。
我在async and constructors上有一篇博文;我推荐用于虚拟机的“异步初始化”技术(与IoC兼容)。
我还在async and properties上发了一篇博客文章;有几种方法,包括异步延迟初始化(用于共享资源)和更新数据绑定属性。这两篇博客文章都是async OOP series的一部分,但这两篇文章特别为虚拟机提供了有用的信息。
异步初始化和异步属性加载都可以使用我编写的名为NotifyTaskCompletion
的帮助程序类型,它实际上只是观察任务并为该任务提供一些数据可绑定属性。
对于异步命令(ICommand
),您可以从SimpleAsyncCommand
开始,就像async
DelegateCommand
一样。更高级的类型是AsyncCommand
,它支持取消,进度报告,并且只要命令已在执行,就会返回CanExecuteChanged
的默认实现false
。
请注意,SimpleAsyncCommand
和AsyncCommand
尚未成为AsyncEx的一部分,因此您必须将源代码复制/粘贴到您自己的项目中才能使用它们。