我目前正在开始使用.NET Prism框架来开发WPF应用程序。我无法确定的一件事是实现对WCF服务或数据库的异步调用的最佳方法?原因是,我不希望WCF / DB调用阻止UI线程,这会导致UI冻结直到操作完成。
根据我的理解,我应该遵循架构:
View (WPF) <=> View Model <=> Application Services <=> DB/WCF
我是否使用AsyncDelegateCommand之类的东西在视图模型中实现异步行为?如果我这样做,那么我无法维护应用程序服务中的任何状态,因为设置任何状态需要在UI线程中完成(除非有解决方法)。
所以另一个选择是在应用程序服务中提供带有回调的异步方法,并让应用程序服务为异步操作生成线程/任务。
我简要介绍了Prism StockTrader参考实现,他们似乎没有异步做任何事情。我认为这应该是一个非常普遍的问题,并且必须有一些最佳实践来解决这个问题。
答案 0 :(得分:3)
我没有在“最佳实践”方面找到任何在线内容。
我个人认为以下设置很好:View <= BINDING => ViewModel <==> DataRepository/DataAccessLayer (Async Calls)
至于保持ViewModel与DAL同步,您可以做一些事情,具体取决于需要同步的数据:
ReadOnlyObservableCollection<T>
并在内部管理其支持集合(在DAL内)。基本上,由于服务引用生成器有助于为您构建异步调用,因此只需使用它并使用DataRepository / DAL管理数据,在内部公开对ViewModel和EventAggregator的引用,以宣布Working / Completed。
我也应该这样说...你可以选择让你的DAL完全同步并在ViewModel上进行所有异步调用,因为你可能想要公开某种类型的“IsWorking / Completed”属性让观点知道正在发生的事情或已经完成的事情。我认为关键是要确保你将所有异步性都粘贴在一个层上(尽管不是View)。在ViewModel层上执行此操作会使构建异步调用的编码工作更多,但它更清晰。你是DAL只做同步事情而不必发布已完成/正在进行的事件。事实上,我实际上说这是更常见的方法。