我第一次尝试使用async
和await
个关键字,我怀疑我是否正确地执行此操作。
在我的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
,但我的数据太小了,我无法弄清楚它是否&# 39;只是我的计算机滞后或真的是DataGrid
。而且,Visual Studio会发出警告:
这种异步方法缺乏等待&#39;运营商并将运行 同步。考虑使用&#39; await&#39;运营商等待 非阻塞API调用,或等待Task.Run(...)&#39;做CPU限制的工作 在背景上 线程。
所以我明白我必须等待GetAllMessagesAsync()
中的某些内容?但是什么?新功能还需要等待其他async
功能吗?我无法弄清楚,我在脑海中陷入无限循环。
答案 0 :(得分:4)
您可以直接返回Task
:
public Task<List<Message>> GetAllMessagesAsync()
{
return Task.Factory.StartNew(() => _context.Messages.ToList());
}