在 viewmodel 的构造函数中调用异步方法加载数据有警告

Posted

技术标签:

【中文标题】在 viewmodel 的构造函数中调用异步方法加载数据有警告【英文标题】:Calling async method to load data in constructor of viewmodel has a warning 【发布时间】:2014-08-25 15:52:14 【问题描述】:

我的视图包含一个 ListView,它显示来自互联网的一些数据,我创建了一个异步方法来加载数据并在我的视图模型的构造函数中调用该方法。它有一个警告提示我现在使用 await 关键字。

在构造函数中异步加载数据的任何其他解决方案?

【问题讨论】:

您应该显示您的代码以及在您的问题中包含实际警告。 如需解决此问题,请阅读 Stephen Cleary 的 "Patterns for Asynchronous MVVM Applications: Data Binding" 和 "Async OOP 2: Constructors"。 因重复而关闭。无论您的构造函数是用于视图模型还是其他任何东西都没有关系。问题是一样的。构造函数不能是异步的。 【参考方案1】:

有几种模式可以应用,Stephan Cleary 的帖子中都提到了这些模式。

但是,让我提出一些不同的建议:

由于您在 WPF 应用程序中,我将使用 FrameworkElement.Loaded 事件并将其绑定到 ViewModel 内部的 ICommand。有界命令将是一个可以等待的Awaitable DelegateCommand。我也会利用System.Windows.Interactivity.InvokeCommandAction

查看 XAML:

<Grid>
 <interactivity:Interaction.Triggers>
     <interactivity:EventTrigger EventName="Loaded">
         <interactivity:InvokeCommandAction Command="Binding MyCommand"/>
     </interactivity:EventTrigger>
 </interactivity:Interaction.Triggers>
</Grid>

视图模型:

public class ViewModel

    public ICommand MyCommand  get; set; 

    public ViewModel()
    
        MyCommand = new AwaitableDelegateCommand(LoadDataAsync);
    

    public async Task LoadDataAsync()
    
        //await the loading of the listview here
    

【讨论】:

【参考方案2】:

我个人会将数据的加载委托给一个方法,例如任务 LoadDataAsync(...) ...但是,如果将异步方法的结果分配给字段,则警告应该消失。如果您正在调用 Wait(),那么您是否应该首先调用异步方法是值得怀疑的。

请参阅http://blog.stephencleary.com/2013/01/async-oop-2-constructors.html,了解您可能感兴趣的异步初始化模式。

【讨论】:

天哪!感谢您发布 Cleary 的工厂模式。我一直在追究为什么我不能将异步重构到 ViewModel 中。现在我能。甜!!

以上是关于在 viewmodel 的构造函数中调用异步方法加载数据有警告的主要内容,如果未能解决你的问题,请参考以下文章

数据应该在哪里加载到 ViewModel

在构造函数中调用异步方法?

在 C# 中的类构造函数中调用异步方法 [重复]

从构造函数调用的异步方法[重复]

我们可以从构造函数中调用异步方法吗? [复制]

如何在viewmodel中的异步任务后更新UI