2017-10-11 44 views
2

這是一個愚蠢的問題,但不知何故,這讓我覺得我失去了一些東西。異步lambda和普通方法在執行方面有什麼不同嗎?像這樣異步lambda執行有任何區別嗎?

var tasks = list.Select(async c => { /* await somewhere */}); 
await Task.WhenAll(tasks); 

async Task<object> GetSomething(object c) { /* await somewhere */} 
// ... 
var task = list.Select(GetSomething); 
await Task.WhenAll(tasks); 

編輯:我問,因爲我有誤解,如果有可能的lambda來表現不同則通常的方法。假設lambda和方法都具有相同的主體,lambda是否有可能會創建一個void task?或執行不會按預期工作?

謝謝,我沒想到會有這麼快的反應!

+3

「async」所做的「所有」都會改變你可以在它關聯的主體內部編寫的代碼(具體地說,它將它從「沒有'await'關鍵字」的C#改變爲'帶'await'關鍵字的C# )並改變返回值(如果有的話)的處理方式。這是一個*實現*方法/ lambda的細節。它對調用者有* no *外部效果(我始終認爲它出現在一個使它看起來像方法簽名的一部分的位置,實際上它不起作用) –

+2

實際上有一個小的區別lambda和方法組,因爲lambdas也是基於返回值解析的。但在你的例子中,這可能不是你需要擔心的事情。但作爲參考,你可以閱讀關於它[這裏](https://stackoverflow.com/questions/5203792/overloaded-method-group-argument-confuses-overload-resolution)或[這裏](https:// stackoverflow。 com/questions/46505262/the-call-is-ambiguous-between-funct-and-functaskt) – Default

+0

我在問,因爲我有誤解,如果lambda的行爲可能不同於常規方法。假設lambda和方法都具有相同的主體,lambda是否有可能會創建一個void task?或執行不會按預期工作?那就是它不會以相同方式工作的用例? –

回答

5

一個lambda創建一個匿名方法或一個表達式樹,取決於它是用在接受委託或類型的上下文中。在創建一個匿名方法的情況下,就像你明確寫了這個方法的情況一樣。捕獲的變量可能會改變方法的定義位置,但它總是一個真正的方法,運行時可以看到它。 async關鍵字不會改變這一點。