我承认这里可能没有掌握一些基本知识,但是在下面的代码中,为什么我必须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);
}
这是我的意思的非常基本的示例,但我希望您能理解。
答案 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
,但是即使在这种情况下,调用方法仍然是异步的。