C# 为什么我必须为异步查询编写多次wait?
我承认这里可能有一些基本的东西我没有掌握,但是在下面的代码中,为什么我必须等待两次相同的查询 我通过他的电子邮件地址查找一个人,这是一个数据库查找。我调用我的私有函数C# 为什么我必须为异步查询编写多次wait?,c#,C#,我承认这里可能有一些基本的东西我没有掌握,但是在下面的代码中,为什么我必须等待两次相同的查询 我通过他的电子邮件地址查找一个人,这是一个数据库查找。我调用我的私有函数GetByEmailQueryAsync,如果找到,它将从数据库返回一条记录。我使用wait进行此调用,因此我确信会返回一个结果(如果找到) 为什么我必须在调用GetByEmailQueryAsync的函数中再次放置wait关键字?然后再次在所有函数中调用GetByEmail。在我看来,这个函数的调用者不应该关心这个函数是否执行了一
GetByEmailQueryAsync
,如果找到,它将从数据库返回一条记录。我使用wait
进行此调用,因此我确信会返回一个结果(如果找到)
为什么我必须在调用GetByEmailQueryAsync
的函数中再次放置wait
关键字?然后再次在所有函数中调用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(字符串emailAddress)
{
返回等待GetByEmailQueryAsync(电子邮件地址);
}
专用异步任务GetByEmailQueryAsync(字符串emailAddress)
{
返回wait DbContext.Set.SingleOrDefaultAsync(x=>x.EmailAddress==EmailAddress);
}
这是我的意思的一个非常基本的例子,但我希望你能理解要点。你不需要等待两者 由于您的
GetByEmail
方法只是调用GetByEmailQueryAsync
,这同样适用:
public Task<Person> GetByEmail(string emailAddress)
{
return GetByEmailQueryAsync(emailAddress);
}
公共任务GetByEmail(字符串emailAddress)
{
返回GetByEmailQueryAsync(电子邮件地址);
}
事实上,不使用wait
两次,意味着只需要一个任务,而不是两个
为什么我必须在调用GetByEmailQueryAsync的函数中再次放置wait关键字?然后再次在所有函数中调用GetByEmail。在我看来,这个函数的调用者不应该关心这个函数是否执行了一些异步任务
虽然将异步代码视为实现细节会很好,但这在C语言中是不可能做到的
一般来说,任何调用异步方法的方法都应该使用await
,调用方法本身也是一个异步方法。因此,它的调用者应该使用await
,而他们自己就是异步方法,等等。这种async
/await
通过代码库的“增长”是自然的,应该这样做
在普通情况下,可以执行,但即使在这种情况下,调用方法仍然是异步的。您不必等待数据库查询-您只需返回任务并等待GetByEmail中的即可。你也可以省略GetByEmail
中的await
,而只是await
调用代码中的结果。@KirkLarkin是的,这绝对是一篇值得阅读的文章,但这里没有提到的陷阱。