gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:20:55 25 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

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

我个人认为以下设置很好:View <= BINDING => ViewModel <==> DataRepository/DataAccessLayer (Async Calls)
至于让您的 ViewModel 与 DAL 保持同步,您可以根据需要同步的数据做几件事:

  • 曝光 ReadOnlyObservableCollection<T> s 用于模型集合并在内部(从 DAL 内部)管理它们的支持集合。
  • 对于单个项目,返回项目的新实例并在异步完成事件上加载项目。
  • 另外,学会喜欢 EventAggregator(它并不太复杂——不过,网上有改进——EventAggregator Extension)。它有很大帮助。最好用它来宣布“工作”和“完成”事件。

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

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

    关于.NET Prism4 WVVM + WPF 异步调用最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6582543/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com