2 回答

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

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