2014-10-08 49 views
2

讓我們舉一個非常簡單的例子。是什麼這之間的區別:這IQueryable <T> and async/await

var sublist = Task.WhenAll(list.Select(x => x.getYAsync())); 

var sublist = Task.WhenAll(list.Select(async x => await x.getYAsync())); 

在這兩種情況下,sublist類型是一樣的,所以唯一的區別是語義。一個人表現比另一個好嗎?比另一個更標準嗎?

回答

3

關於異常傳播的唯一顯着差異。

如果getYAsync拋出未存儲在返回的任務異常*第一個選項調用Task.WhenAll時,而第二個選項會存儲在從Task.WhenAll返回的任務除外,它將會被拋出時,將有一個例外任務正在等待。

除此之外,還有一個狀態機在async lambda中構建,它有一些(非常小的)開銷。

第一個選項執行略微更好,而第二個選項比另一個更標準。 更安全的選擇是明確指出asyncawait,但在這種簡單的情況下,它有點多餘。

*例如:Task getYAsync() { throw new Exception(); return Task.Delay(1)}