作为一个例子,我有一个ASP.NET Core API controller
从服务中获取一些数据并2
实现控制器方法的可能方法:
使用异步/等待:
[HttpGet]
public async Task<IActionResult> GetSomeDataAsync()
{
return await someService.GetSomeDataAsync();
}
没有异步/等待:
[HttpGet]
public Task<IActionResult> GetSomeDataAsync()
{
return someService.GetSomeDataAsync();
}
这两个哪个更好?这里的关键是只有 1 次调用另一个异步方法(someService.GetSomeDataAsync()
).
根据ASP.NET Core 性能最佳实践 https://learn.microsoft.com/en-us/aspnet/core/performance/performance-best-practices?view=aspnetcore-3.1来自 ASP.NET 团队:
避免阻塞呼叫
ASP.NET Core 应用程序应设计为同时处理许多请求。异步 API 允许一小群线程通过不等待阻塞调用来处理数千个并发请求。该线程可以处理另一个请求,而不是等待长时间运行的同步任务完成。
ASP.NET Core 应用程序中的一个常见性能问题是阻塞异步调用。许多同步阻塞调用会导致线程池饥饿和响应时间降低。
- Do make 热代码路径 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/best-practices?view=aspnetcore-3.1#understand-hot-code-paths异步。
- 如果异步 API 可用,请异步调用数据访问、I/O 和长时间运行的操作 API。
- 不使用任务.运行() https://www.ben-morris.com/why-you-shouldnt-create-asynchronous-wrappers-with-task-run/使同步 API 变为异步。
- 务必使控制器/Razor 页面操作异步。整个调用堆栈是异步的,以便受益异步/等待 https://learn.microsoft.com/en-us/dotnet/csharp/asynchronous-programming/async-scenarios模式。
避免在 HttpRequest/HttpResponse body 上同步读取或写入
ASP.NET Core 中的所有 I/O 都是异步的。服务器实现 Stream 接口,该接口具有同步和异步重载。应优先选择异步以避免阻塞线程池线程。阻塞线程可能会导致线程池饥饿。
优先选择 ReadFormAsync 而不是 Request.Form
Use HttpContext.Request.ReadFormAsync
代替HttpContext.Request.Form
. HttpContext.Request.Form
满足以下条件时可以安全地只读:
- 该表格已通过致电读取
ReadFormAsync
, and
- 正在使用读取缓存的表单值
HttpContext.Request.Form
优化数据访问和 I/O
与数据存储和其他远程服务的交互通常是 ASP.NET Core 应用程序中最慢的部分。高效地读取和写入数据对于良好的性能至关重要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)