gpt4 book ai didi

c# - 我是否应该始终在 ASP.NET Core API Controller 中使用 async/await

转载 作者:行者123 更新时间:2023-12-03 16:53:13 25 4
gpt4 key购买 nike

例如,我有一个 ASP.NET Core API controller从服务中获取一些数据和2实现 Controller 方法的可能方法:

使用异步/等待:

[HttpGet]
public async Task<IActionResult> GetSomeDataAsync()
{
return await someService.GetSomeDataAsync();
}

没有异步/等待:
[HttpGet]
public Task<IActionResult> GetSomeDataAsync()
{
return someService.GetSomeDataAsync();
}

这两个哪个更好?这里的关键是只有 1 次调用另一个异步方法 ( someService.GetSomeDataAsync())。

最佳答案

根据ASP.NET Core Performance Best Practices来自 ASP.NET 团队:
避免阻塞调用
ASP.NET Core 应用程序应设计为同时处理多个请求。异步 API 允许少量线程通过不等待阻塞调用来处理数千个并发请求。线程可以处理另一个请求,而不是等待长时间运行的同步任务完成。
ASP.NET Core 应用程序中的一个常见性能问题是阻塞可能是异步的调用。许多同步阻塞调用会导致线程池饥饿和响应时间下降。

  • 使热代码路径异步。
  • 如果异步 API 可用,则异步调用数据访问、I/O 和长时间运行的操作 API。不要使用 Task.Run 使同步 API 异步。
  • 使 Controller /Razor 页面操作异步。整个调用堆栈是异步的,以便从 async/await 模式中受益。

  • 避免在 HttpRequest/HttpResponse 正文上同步读取或写入
    ASP.NET Core 中的所有 I/O 都是异步的。服务器实现 Stream 接口(interface),该接口(interface)具有同步和异步重载。应该首选异步的,以避免阻塞线程池线程。阻塞线程会导致线程池饥饿。
    ReadFormAsync 优于 Request.Form
    使用 HttpContext.Request.ReadFormAsync而不是 HttpContext.Request.Form . HttpContext.Request.Form在以下条件下可以安全地只读:
  • 该表格已通过调用 ReadFormAsync 读取。 , 和
  • 正在使用 HttpContext.Request.Form 读取缓存的表单值

  • 优化数据访问和 I/O
    与数据存储和其他远程服务的交互通常是 ASP.NET Core 应用程序中最慢的部分。有效地读取和写入数据对于良好的性能至关重要。
  • 务必异步调用所有数据访问 API。
  • 关于c# - 我是否应该始终在 ASP.NET Core API Controller 中使用 async/await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61153553/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com