1.多个 .NET Core SDK 版本之间进行切换 global.json2.HttpClientHandler VS SocketsHttpHandler3..Net Core中使用DiagnosticSource进行日志记录4.DiagnosticSource DiagnosticListener 无侵入式分布式跟踪5.LoggerMessageAttribute 高性能的日志记录6..Net Core 你必须知道的source-generators7..NET Core使用 CancellationToken 取消API请求8.使用 LogProperties source generator 丰富日志9..Net Core 使用 TagProvider 与 Enricher 丰富日志10.C# 12 拦截器 Interceptors11.为什么推荐在 .NET 中使用 YAML 配置文件12..NET 9 中的 多级缓存 HybridCache13..NET 9 增强 OpenAPI 规范,不再内置swagger14.Scoop: 开发者多环境管理利器15.在 .NET 中使用 Tesseract 识别图片文字16.AsyncLocal的妙用17..NET最佳实践:webapi返回IAsyncEnumerable提升性能18..NET最佳实践:避免滥用Task.Run
19..NET最佳实践:避免同步读取HttpRequest
20..NET最佳实践:业务逻辑减少使用异常为什么要避免同步读取
ASP.NET Core 中的所有 I/O 操作都是异步的。服务器实现了 Stream
接口,该接口同时具备同步和异步的方法。
在进行 I/O 操作时,应优先使用异步方法,以避免阻塞线程池的线程。
如果阻塞了线程池线程,可能会导致服务器无法处理更多请求,造成急剧性性能下降。
尤其是当客户端上传速度缓慢时,同步读取将阻塞线程直到整个请求体被全部读取完成。
如何避免同步读取
错误的做法
以下代码示例使用了同步方法 ReadToEnd
,导致线程被阻塞:
public class BadStreamReaderController : Controller
{
[HttpGet("/contoso")]
public ActionResult<ContosoData> Get()
{
var json = new StreamReader(Request.Body).ReadToEnd();
return JsonSerializer.Deserialize<ContosoData>(json);
}
}
在这段代码中,Get
方法将整个 HTTP 请求体同步读入内存。如果客户端上传速度缓慢,应用程序将阻塞在这个读取操作上,导致效率下降。
正确的做法
使用异步方法 ReadToEndAsync
,可以避免阻塞线程:
public class GoodStreamReaderController : Controller
{
[HttpGet("/contoso")]
public async Task<ActionResult<ContosoData>> Get()
{
var json = await new StreamReader(Request.Body).ReadToEndAsync();
return JsonSerializer.Deserialize<ContosoData>(json);
}
}
这段代码使用异步读取方法,在读取过程中不会阻塞线程,可以提升性能和响应速度。
读取表单数据时的注意事项
错误的做法
使用 HttpContext.Request.Form
,会在内部执行同步读取,导致线程被阻塞:
public class BadReadController : Controller
{
[HttpPost("/form-body")]
public IActionResult Post()
{
var form = HttpContext.Request.Form;
Process(form["id"], form["name"]);
return Accepted();
}
}
正确的做法
使用 ReadFormAsync
,进行异步读取:
public class GoodReadController : Controller
{
[HttpPost("/form-body")]
public async Task<IActionResult> Post()
{
var form = await HttpContext.Request.ReadFormAsync();
Process(form["id"], form["name"]);
return Accepted();
}
}
这种做法使用异步方式读取表单数据,能有效避免阻塞线程池资源。
结论
在 ASP.NET Core 开发中,应符合框架的异步操作模式,避免使用同步方法读取 HTTP 请求文本。
这样可以有效地提升应用程序的性能和响应速度,避免因阻塞导致的急剧性性能下降。
![](https://images.cnblogs.com/cnblogs_com/chenyishi/1348350/o_240408130234_wx.png)
分类:
.NET Core+
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 本地部署 DeepSeek:小白也能轻松搞定!
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 如何基于DeepSeek开展AI项目