1

我第一次尝试使用asyncawait关键字,我怀疑我是否正确地这样做了。

在我的 WPF 表单Loaded事件中,我使用了一种方法:

private void MessagesWindowLoaded(object sender, RoutedEventArgs e)
{
    DataGridMessagesLoadAsync();
}

看起来像这样:

private async void DataGridMessagesLoadAsync()
{
    _messages = await _messageService.GetAllMessagesAsync();
    dataGridMessages.ItemsSource = _messages;
    if (_messages.Count() == 0) return;
    dataGridMessages.Columns[6].Visibility = System.Windows.Visibility.Collapsed;
    dataGridMessages.Columns[8].Visibility = System.Windows.Visibility.Collapsed;
    dataGridMessages.Columns[10].Visibility = System.Windows.Visibility.Collapsed;
    dataGridMessages.Columns[11].Visibility = System.Windows.Visibility.Collapsed;
    dataGridMessages.Columns[12].Visibility = System.Windows.Visibility.Collapsed;
}

GetAllMessagesAsync()看起来像这样:

public async Task<List<Message>> GetAllMessagesAsync()
{
    return (from m in _context.Messages select m).ToList();
}

DataGrid我不确定我是否得到任何异步 - 似乎整个窗口都在等待DataGrid. 更重要的是,Visual Studio 会发出警告:

此异步方法缺少“等待”运算符,将同步运行。考虑使用 'await' 运算符来等待非阻塞 API 调用,或使用 'await Task.Run(...)' 在后台线程上执行 CPU 密集型工作。

所以我知道我必须等待什么GetAllMessagesAsync()?但是什么?新功能还必须等待其他async功能吗?我想不通,我陷入了一个无限循环。

4

1 回答 1

4

你可以直接返回一个Task

public Task<List<Message>> GetAllMessagesAsync()
{
    return Task.Factory.StartNew(() => _context.Messages.ToList());
}
于 2012-11-12T20:13:18.110 回答