为什么我必须多次编写await才能进行异步查询?

时间:2020-01-30 10:53:57

标签: c#

我承认这里可能没有掌握一些基本知识,但是在下面的代码中,为什么我必须await两次进行相同的查询?

我正在通过一个人的电子邮件地址查找一个人,这是一个数据库查找。我调用我的私有函数GetByEmailQueryAsync,如果找到,它将从数据库返回一条记录。我为此通话使用await,所以我确定返回了结果(如果找到)。

为什么我必须在调用await的函数中再次输入GetByEmailQueryAsync关键字?然后在所有函数中再次调用GetByEmail。我认为,此函数的调用者不必关心此函数是否执行某些异步任务。 再次,我可能在这里缺少一些基本知识。

public async Task<Person> GetByEmail(string emailAddress)
{
    return await GetByEmailQueryAsync(emailAddress);
}

private async Task<Person> GetByEmailQueryAsync(string emailAddress)
{
    return await DbContext.Set<Person>.SingleOrDefaultAsync(x => x.EmailAddress == emailAddress);
}

这是我的意思的非常基本的示例,但我希望您能理解。

2 个答案:

答案 0 :(得分:2)

您不需要都等待。

由于您的GetByEmail方法只是调用GetByEmailQueryAsync,因此效果也很好:

public Task<Person> GetByEmail(string emailAddress)
{
    return GetByEmailQueryAsync(emailAddress);
}

实际上,如果不使用两次await,则意味着只需要一个Task,而不是两个。

答案 1 :(得分:0)

为什么必须在调用GetByEmailQueryAsync的函数中再次放置await关键字?然后在所有函数中再次调用GetByEmail。我认为,此函数的调用者不必关心此函数是否执行某些异步任务。

虽然最好将异步代码作为实现细节,但这在C#语言中是不可能的。

作为一般规则,任何调用异步方法的方法都应使用await来使用它,并且调用方法本身也是异步方法。因此,它的调用者应该使用await来使用它,并且它们本身是异步方法,等等。通过代码库实现的async / await的这种“增长”是自然的,应该这样做async all the way

简单情况下,可以elide async/await,但是即使在这种情况下,调用方法仍然是异步的。