繁体   English   中英

为什么我必须为异步查询多次编写等待?

[英]Why do I have to write await multiple times for an async query?

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

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

为什么我必须在调用GetByEmailQueryAsync的函数中再次放置await关键字? 然后再次在所有调用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);
}

这是我的意思的一个非常基本的例子,但我希望你明白要点。

你不需要等待两者。

由于您的GetByEmail方法只是调用GetByEmailQueryAsync ,因此这也能正常工作:

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

事实上,不使用await两次,这意味着只需要一个Task ,而不是两个。

为什么我必须在调用 GetByEmailQueryAsync 的函数中再次放置 await 关键字? 然后再次在所有调用 GetByEmail 的函数中。 在我看来,这个函数的调用者不应该关心这个函数执行一些异步任务。

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

作为一般规则,任何调用异步方法的方法都应该使用await消费它,并且调用方法本身也是一个异步方法。 所以它的调用者应该使用await来使用它,并且它们自己是异步方法等。 async / await通过代码库的这种“增长”是自然的,并且一直走async是正确

微不足道的情况下,可以省略async / await ,但即使在这种情况下,调用方法仍然是异步的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM