繁体   English   中英

我必须在调用API链中的所有方法中使用async / await吗?

[英]Do I have to use async/await in all methods in call API chain?

我想知道如何异步实现Dapper。 我发现了这个

看起来很酷,但我注意到该调用api链中的所有方法都使用了async / await:

控制器:

[HttpGet]
[Route("dob/{dateOfBirth}")]
public async Task<ActionResult<List<Employee>>> GetByID(DateTime dateOfBirth)
{
    return await _employeeRepo.GetByDateOfBirth(dateOfBirth);
}

仓库:

public async Task<List<Employee>> GetByDateOfBirth(DateTime dateOfBirth)
{
    using (IDbConnection conn = Connection)
    {
        string sQuery = "SELECT ID, FirstName, LastName, DateOfBirth FROM Employee WHERE DateOfBirth = @DateOfBirth";
        conn.Open();
        var result = await conn.QueryAsync<Employee>(sQuery, new { DateOfBirth = dateOfBirth });
        return result.ToList();
    }
}

因此,如果我们之间要有更多的层,例如服务等,那么这些层也应该具有异步/等待功能? 我认为这是多余的,完全可以在需要真正返回异步结果的方法中使用异步/等待。 在其他地方,例如Controller,Services-仅Task是必需的。

可以在我们使用处理整个上下文的块的地方放置异常。 因此,我们还必须具有异步/等待功能。

我是对的,还是我想念什么?


@编辑

因此控制器可以另存为:

[HttpGet]
[Route("dob/{dateOfBirth}")]
public Task<ActionResult<List<Employee>>> GetByID(DateTime dateOfBirth)
{
    return _employeeRepo.GetByDateOfBirth(dateOfBirth);
}

如您所见,我删除了async / await-现在只有存储库具有async / await,结果和性能应该相同,对吗?

...-仅任务是必需的。

是。 但是在您只有一个异步调用且这是方法中的最后一条语句的情况下。 GetByDateOfBirth()方法不合格,因为在await 之后出现了ToList()

它被称为“消除异步和等待关键字” ,这是一个小的优化。

我通常不麻烦删除它们。 具有可预测,可读和修改安全的代码更为重要。 此外, await有助于转换有害的协变量和反变量返回类型。

暂无
暂无

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

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