2 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
我正在嘗試決定在我的代碼庫中使用哪一個(gè),并且根據(jù)我的知識(shí),所有 3 個(gè)的行為都是相同的。
在這個(gè)具體例子中,這基本上是正確的。
此創(chuàng)建一個(gè)引用?IsOddAsync
?方法的委托:
await?ActionAsync(context,?IsOddAsync);
這個(gè)為 lambda 表達(dá)式創(chuàng)建一個(gè)方法,委托引用編譯器生成的方法:
await?ActionAsync(context,?x?=>?IsOddAsync(x));
這個(gè)函數(shù)的作用相同,但對(duì)于異步 lambda,因此編譯器生成的方法也有一個(gè)?async
?狀態(tài)機(jī):
await?ActionAsync(context,?async?x?=>?await?IsOddAsync(x).ConfigureAwait(false));
一般來說,你的問題可以歸結(jié)為兩個(gè)問題:
我應(yīng)該使用方法組而不是 lambda 嗎?是的你應(yīng)該。這樣做沒有任何缺點(diǎn),而且效率更高、代碼更短,而且對(duì)可維護(hù)性沒有任何影響。
我應(yīng)該刪除
async
/await
還是保留關(guān)鍵字?這個(gè)更加細(xì)致。
在這種特殊情況下省略?沒問題,因?yàn)?lambda 所做的只是調(diào)用單個(gè)方法并傳遞其參數(shù)。在調(diào)用?之前或之后,lambda 不可能拋出異常。async
?async
IsOddAsync
但是,如果您的 lambda 更復(fù)雜 - 在將?x
?傳遞給?IsOddAsync
?之前對(duì)其進(jìn)行操作,或者對(duì)結(jié)果進(jìn)行操作,或者使用using
?塊,那么您需要保留?async
/await
?關(guān)鍵字以獲得最大的可維護(hù)性。

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
await
與返回Task
和...之間的不同:
await?ActionAsync(context,?async?x?=>?await?IsOddAsync(x).ConfigureAwait(false)); await?ActionAsync(context,?x?=>?IsOddAsync(x));
在某些情況下,您不需要?await
(當(dāng)然也不需要?async
)
執(zhí)行異步操作的方法不需要使用await,如果:
方法內(nèi)部只有一次異步調(diào)用
異步調(diào)用在方法的最后
沒有必要捕獲/處理任務(wù)中可能發(fā)生的異常
在這種情況下,您可以中間返回Task
。
請(qǐng)注意,行為上存在細(xì)微差別 - 取決于IsOddAsync
的實(shí)現(xiàn):
重要提示:返回任務(wù)而不是等待它,會(huì)更改方法的異常行為,因?yàn)樗粫?huì)在啟動(dòng)任務(wù)的方法中拋出異常,而是在等待任務(wù)的方法中拋出異常。
正如 Gabriel Luci 所指出的,在當(dāng)前實(shí)現(xiàn)的?IsOddAsync
(一次調(diào)用和一次?await
)中,行為沒有差異。
x => IsOddAsync(x)
與IsOddAsync
和...之間的不同
await?ActionAsync(context,?x?=>?IsOddAsync(x)); await?ActionAsync(context,?IsOddAsync);
在第一個(gè)中,您將使用參數(shù)創(chuàng)建一個(gè)匿名 (lambda) 方法x
。由于?IsOddAsync
?也有一個(gè)參數(shù)(類型相同),因此不需要 lambda 方法。
請(qǐng)注意,如果?IsOddAsync
?有其他參數(shù),例如,您需要 lambda和第二個(gè)參數(shù),那么你需要 lambda。示例:
await?ActionAsync(context,?x?=>?IsOddAsync(x,?"mySecondParameter"));
在這種情況下,除了內(nèi)部拋出異常時(shí)的調(diào)用堆棧之外,行為沒有任何區(qū)別。
- 2 回答
- 0 關(guān)注
- 169 瀏覽
添加回答
舉報(bào)