2012-11-12 124 views
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調用,或者'等待Task.Run(...)'在線程的背景 上執行CPU綁定工作 。

所以我明白我將不得不等待GetAllMessagesAsync()?但是什麼?而新功能將不得不等待一些其他的功能,如async功能?我無法弄清楚,我在腦海中陷入了一個無限循環。

回答

4

你可以只返回一個Task直接:

public Task<List<Message>> GetAllMessagesAsync() 
{ 
    return Task.Factory.StartNew(() => _context.Messages.ToList()); 
} 
+0

感謝,現在它是清晰可見的UI不會被阻斷。但是,應該命名爲'GetAllMessagesAsync()'還是'GetAllMessages()'?根據Microsoft提出的命名約定,所有使用'async'關鍵字的方法都應該有這樣的後綴,但是如果沒有這樣的修飾符? – pmichna

+2

@vtvs - 我相信約定是使用Async後綴來返回一個'Task'的方法,'async'的使用是一個實現細節。 – Lee