Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我必须为异步查询编写多次wait?_C# - Fatal编程技术网

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是的,这绝对是一篇值得阅读的文章,但这里没有提到的陷阱。