当控制器已经在 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
所做的所有事情,实际上就是让您在该方法中编写 await
。 await
所做的只是等待已经在其他地方启动的异步操作,而不是阻塞。
【参考方案1】:
作为一般规则,任何 I/O 代码都应在 ASP.NET Core 应用程序中异步完成。这包括所有数据库查询。
ASP.NET 上的异步代码实际上使每个请求的运行速度稍慢,但它也减少了应用程序使用的线程数,从而使其能够处理更多的并发请求。
【讨论】:
以上是关于当控制器已经在 ASP .NET 核心中使用异步时,服务中的方法是不是也必须是异步的?的主要内容,如果未能解决你的问题,请参考以下文章
如何将自定义对象从异步操作过滤器传递到 ASP.net 核心中的控制器?
调试异步 ASP.NET WebAPI 控制器在“任务”窗口中显示“没有要显示的任务”
为啥当控制器位于 asp.net 核心应用程序的单独程序集中时,TestServer 无法找到控制器?