2

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

据我了解,我应该遵循架构:

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

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

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

我简要研究了 Prism StockTrader 参考实现,它们似乎没有异步执行任何操作。我觉得这应该是一个非常普遍的问题,并且必须有一些最佳实践来解决这个问题。

4

1 回答 1

3

我没有在网上找到任何关于“最佳实践”的东西。

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

就保持 ViewModel 与 DAL 同步而言,您可以根据需要同步的数据做几件事:

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

基本上,由于服务引用生成器帮助您构建异步调用,只需使用它并使用您的 DataRepository/DAL 来管理数据,在内部公开对您的 ViewModels 和 EventAggregator 的引用以宣布工作/完成。


我也应该这么说...您可以选择使您的 DAL 完全同步,并在 ViewModel 上对它进行所有异步调用,因为您可能希望公开某种类型的“IsWorking/Completed”属性以让视图知道某事正在发生或已经完成。我认为关键是确保您将所有异步性都保留在一层(虽然不是视图)。在 ViewModel 层上执行此操作会使构建异步调用的编码工作更多,但更简洁。您是 DAL 仅同步执行操作,而不必发布已完成/正在工作的事件。事实上,我实际上会说这是更常见的方法。

于 2011-07-05T12:58:59.900 回答