[英]dotnet.core Asp.net Async / await everywhere?
我最近开始在一家新公司工作。 他们有一个 ASP.NET Core 3.1 应用程序托管在 IIS 中,该应用程序接受来自 ZD18B8624A0F5F721ZB 应用程序的 API 调用。 他们使用 async/await 字面意思是“无处不在”:ASP.NET 控制器中的方法具有public async Task<IActionResult> Foo()
之类的签名,所有数据库查询都是异步的,无论如何都调用外部 API(我有点理解)。
所以,而不是简单地
[HttpPost("api/ignorableDepartment")]
public IActionResult Add([FromBody] AddIgnorableDepartmentRequest model)
{
return _ignorableGroupManager
.Add(model)
.ToResult();
}
代码现在读取
[HttpPost("api/ignorableDepartment")]
public async Task<IActionResult> AddAsync([FromBody] AddIgnorableDepartmentRequest model)
{
return await _ignorableGroupManager
.AddAsync(model)
.ToResultAsync()
.ConfigureAwait(false);
}
这个应用程序只有 1-2 人同时使用,上面方法中的调用最多需要 1ms。
过去,如果处理预计持续 1 秒或更长时间,我只会使用 async/await,而在所有其他情况下,我只会依靠 IIS 来处理跨线程/内核传播多个请求。
我是不是错过了过去几年的一些东西,这就是新的发展方式? 或者这只是矫枉过正?
更新信息以回答评论中的问题
AddAsync
将model
添加到数据库中。 所以我想没关系ToResultAsync()
看起来如下(恕我直言,这没有任何意义,因为 controller 方法无论如何都会返回一个Task<IActionResult>
。它也不以任何方式解析传递的信息,这是To...
方法所指示的)public static async Task<IActionResult> ToResultAsync(this Task task)
{
if (task == null)
{
throw new ArgumentNullException(nameof(task));
}
await task.ConfigureAwait(false);
return new OkObjectResult(ResultResponse.Success);
}
上述方法中的调用最多需要 1ms。
过去,如果处理预计持续 1 秒或更长时间,我只会使用 async/await
我认为这是一个误解。 “异步”并不意味着“更快”。 实际上,因为异步请求有更多的记账工作要做,所以异步请求实际上(一点点,一点点)更慢。
ASP.NET 中的异步是关于可扩展性的。 异步请求释放更多线程,以便服务器可以同时处理更多请求。
此应用程序仅供 1-2 人同时使用
所以你说应用程序不需要扩展。 这是 ASP.NET 上异步的主要好处。
我是不是错过了过去几年的一些东西,这就是新的发展方式? 或者这只是矫枉过正?
有几个不同的场景需要考虑。
一种情况是当您编写新代码时。 如果您正在编写新代码(或新应用程序),那么默认情况下一切都是异步的,我认为这很好。 也许该应用程序将来需要扩展。 或者迁移到云端,按使用付费的 model 意味着异步应用程序通常更便宜。 一般来说,新应用从一开始就应该是异步的。
另一种情况是当您有一个同步应用程序并且您想确定将其更改为异步是否值得。 在这种情况下,您必须评估应用程序的必要可扩展性和未来方向,并判断是否值得开发人员花费时间。
是的,这是最好的做法。
我猜你的同事只是习惯了这样做,无论应用程序加载多么繁重。
这是一个很好的做法。 我们也在这样做。
关键是如果在某些端点中您想要执行一些相对繁重的操作(假设超过 1-2 秒),通过使用 async/await 您可以将线程释放到 go 并做一些额外的工作而不是等待。 在大多数情况下,这是一种性能提升,
所以我建议你习惯它并开始做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.