.NET Prism4 WVVM + WPF异步调用最佳实践

时间:2011-07-05 12:20:50

标签: .net prism-4

我目前正在开始使用.NET Prism框架来开发WPF应用程序。我无法确定的一件事是实现对WCF服务或数据库的异步调用的最佳方法?原因是,我不希望WCF / DB调用阻止UI线程,这会导致UI冻结直到操作完成。

根据我的理解,我应该遵循架构:

View (WPF) <=> View Model <=> Application Services <=> DB/WCF

我是否使用AsyncDelegateCommand之类的东西在视图模型中实现异步行为?如果我这样做,那么我无法维护应用程序服务中的任何状态,因为设置任何状态需要在UI线程中完成(除非有解决方法)。

所以另一个选择是在应用程序服务中提供带有回调的异步方法,并让应用程序服务为异步操作生成线程/任务。

我简要介绍了Prism StockTrader参考实现,他们似乎没有异步做任何事情。我认为这应该是一个非常普遍的问题,并且必须有一些最佳实践来解决这个问题。

1 个答案:

答案 0 :(得分:3)

我没有在“最佳实践”方面找到任何在线内容。

我个人认为以下设置很好:View <= BINDING => ViewModel <==> DataRepository/DataAccessLayer (Async Calls)

至于保持ViewModel与DAL同步,您可以做一些事情,具体取决于需要同步的数据:

  • 为模型的集合公开ReadOnlyObservableCollection<T>并在内部管理其支持集合(在DAL内)。
  • 对于单个项目,返回项目的新实例并在异步已完成事件上加载项目。
  • 此外,学会喜欢EventAggregator(它并不过分复杂 - 尽管如此,它还有在线改进 - EventAggregator Extension)。它有很大帮助。最好用它来宣布“工作”和“完成”事件。

基本上,由于服务引用生成器有助于为您构建异步调用,因此只需使用它并使用DataRepository / DAL管理数据,在内部公开对ViewModel和EventAggregator的引用,以宣布Working / Completed。


我也应该这样说...你可以选择让你的DAL完全同步并在ViewModel上进行所有异步调用,因为你可能想要公开某种类型的“IsWorking / Completed”属性让观点知道正在发生的事情或已经完成的事情。我认为关键是要确保你将所有异步性都粘贴在一个层上(尽管不是View)。在ViewModel层上执行此操作会使构建异步调用的编码工作更多,但它更清晰。你是DAL只做同步事情而不必发布已完成/正在进行的事件。事实上,我实际上说这是更常见的方法。

相关问题