当控制器已经在 ASP .NET 核心中使用异步时,服务中的方法是不是也必须是异步的?

Posted

技术标签:

【中文标题】当控制器已经在 ASP .NET 核心中使用异步时,服务中的方法是不是也必须是异步的?【英文标题】:Do the methods in the services also have to be async when the controller is already using async in ASP .NET core?当控制器已经在 ASP .NET 核心中使用异步时,服务中的方法是否也必须是异步的? 【发布时间】:2020-04-05 15:43:56 【问题描述】:

我对 ASP .NET CORE 中的 异步编程 非常陌生。我为我的检查令牌功能制作了一个服务控制器。这是我在 Authservice 中的方法:

public AppUser CheckToken(string token)

    if (token == null || string.IsNullOrWhiteSpace(token))
        throw new CustomUnauthorizedException("Unauthorized", "You are not authorized to perform this action");

    var user = _context.DbSet<AppUser>().Query.FirstOrDefault(x => x.TOKEN == token);
    if (user == null)
        throw new CustomUnauthorizedException("Unauthorized", "You are not authorized to perform this action");

    return user;

这是我在控制器中的方法:

[HttpGet("Id")]
public async Task<ActionResult<IEnumerable<Follow>>> GetFollows([FromHeader]string token, long Id)

    var user = _authService.CheckToken(token);
    return await _context.DbSet<Follow>().Query.Where(x => x.Id == Id && x.UserId == 
    user.UserId).ToListAsync();

我的代码运行良好,但一位同事建议我这样做:

您对数据库所做的一切都必须使用异步和任务

他建议我也用 async 编写 service 方法

我使用依赖注入以异步方法从服务中调用该方法。

我的问题:

我还需要在异步任务中编写服务中的方法吗?

这是使用异步编程的正确方法吗?

我使用过的来源:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

【问题讨论】:

这取决于,如果你想处理你在服务中获得的对象,例如将它们写入 redis 缓存中,执行此操作的操作将是异步的。如果您只是使用服务加载/保存内容而不将它们存储在其他地方,则不需要。我自己喜欢验证我的对象,所以我的服务方法大多是异步的。 所以我用async两次没问题吧?一个用于服务,一个用于控制器? 不,这很好,但如果你真的想知道,也基于性能,你将不得不对这个问题进行基准测试 很多人很早就对async/await感到困惑。 async 所做的所有事情,实际上就是让您在该方法中编写 awaitawait 所做的只是等待已经在其他地方启动的异步操作,而不是阻塞。 【参考方案1】:

作为一般规则,任何 I/O 代码都应在 ASP.NET Core 应用程序中异步完成。这包括所有数据库查询。

ASP.NET 上的异步代码实际上使每个请求的运行速度稍,但它也减少了应用程序使用的线程数,从而使其能够处理更多的并发请求。

【讨论】:

以上是关于当控制器已经在 ASP .NET 核心中使用异步时,服务中的方法是不是也必须是异步的?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC中使用异步控制器

如何将自定义对象从异步操作过滤器传递到 ASP.net 核心中的控制器?

调试异步 ASP.NET WebAPI 控制器在“任务”窗口中显示“没有要显示的任务”

为啥当控制器位于 asp.net 核心应用程序的单独程序集中时,TestServer 无法找到控制器?

控制器 ASP.net 核心 2.1 中的 Jwt 角色身份验证

什么时候应该在 ASP.NET MVC 中使用异步控制器?