2015-04-28 293 views
3

我已經返回完成之前下面的方法(方法上剪下來的簡潔):異步調用不等待

private void ProcessAllItems(List<Item> items) 
{ 
    items.ForEach(async item => 
    { 
     var response = await Processor.IOBoundTaskAsync(item); 
     // Some further processing on the response object. 
    }); 
} 

的Processor.IOBoundTaskAsync方法返回一個任務<SomeResponseObject>,所以不是虛空。

那麼,發生了什麼?

我希望lambda foreach一次處理一個項目,所以不是並行。對於第一次迭代,代碼進入IOBoundTaskAsync並獲取第一個「await」(它將調用4個等待的Web服務方法的第一個),然後調用方法「ProcessAllItems」退出。

我只使用測試數據,所以我的列表中只有1個項目。

我錯過了什麼?

回答

7

List<T>.ForEach將您的異步lambda轉換爲async void,因爲它接受Action<T>。雖然這樣做並且異常處理有一些複雜性,但您的ForEach調用應該正常工作。否則,您可能不會正確使用異步模式。我建議你在第一個await之後設置一個斷點,並看到繼續執行。

我勸你還是使用常規foreach代替:

private async Task ProcessAllItemsAsync(List<Item> items) 
{ 
    foreach (var item in items) 
    { 
     var response = await Processor.IOBoundTaskAsync(item); 
     // Some further processing on the response object. 
    } 
} 

閱讀How can I use Async with ForEach?更多。