无需等待即可返回任务
执行异步操作的方法在以下情况下不需要使用 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();
这将提高性能,因为它将节省编译器生成额外的异步状态机。