无需等待即可返回任务

执行异步操作的方法在以下情况下不需要使用 await

  • 方法中只有一个异步调用
  • 异步调用位于方法的末尾
  • 不需要在任务中发生捕获/处理异常

考虑这个返回 Task 的方法:

public async Task<User> GetUserAsync(int id)
{
    var lookupKey = "Users" + id;

    return await dataStore.GetByKeyAsync(lookupKey);
}

如果 GetByKeyAsyncGetUserAsync 具有相同的签名(返回 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();

这将提高性能,因为它将节省编译器生成额外的异步状态机。