無需等待即可返回任務
執行非同步操作的方法在以下情況下不需要使用 await
:
- 方法中只有一個非同步呼叫
- 非同步呼叫位於方法的末尾
- 不需要在任務中發生捕獲/處理異常
考慮這個返回 Task
的方法:
public async Task<User> GetUserAsync(int id)
{
var lookupKey = "Users" + id;
return await dataStore.GetByKeyAsync(lookupKey);
}
如果 GetByKeyAsync
與 GetUserAsync
具有相同的簽名(返回 Task<User>
),則可以簡化該方法:
public Task<User> GetUserAsync(int id)
{
var lookupKey = "Users" + id;
return dataStore.GetByKeyAsync(lookupKey);
}
在這種情況下,該方法不需要標記為 async
,即使它正在執行非同步操作。GetByKeyAsync
返回的任務直接傳遞給呼叫方法,它將被呼叫。
重要說明 :返回 Task
而不是等待它,會更改方法的異常行為,因為它不會在啟動任務的方法中丟擲異常,而是在等待它的方法中。
public Task SaveAsync()
{
try {
return dataStore.SaveChangesAsync();
}
catch(Exception ex)
{
// this will never be called
logger.LogException(ex);
}
}
// Some other code calling SaveAsync()
// If exception happens, it will be thrown here, not inside SaveAsync()
await SaveAsync();
這將提高效能,因為它將節省編譯器生成額外的非同步狀態機。