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

时间:2014-07-04 10:18:05

标签: c# .net wpf asynchronous async-await

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

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

3 个答案:

答案 0 :(得分:17)

有一些可以应用的模式,所有这些都在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
    }
}

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

不要使用构造函数来做到这一点。 您可以使用事件窗口加载完成该操作。

这是一个小例子:

public YourWindow()
{
    InitializeComponent();
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    // Your code here ...
    // If you want use async, use the keyword async in the event method.
    // private async void Window_Loaded(object sender, RoutedEventArgs e)
}

记住要在XAML中添加事件:

<Title="YourWindow" ... Loaded="Window_Loaded">