.NET Core Web API异步接口请求时长不符合预期问题排查
.NET Core异步Web API请求串行执行问题解析
问题详情
我在.NET Core Web API中实现了如下异步接口:
[HttpGet] public async Task<ActionResult<List<Product>>> GetProduct() { await Task.Delay(10000); return await Task.FromResult(Ok(Products)); }
按照async异步编程的认知,异步操作不会阻塞线程,服务器应该能复用线程同时处理多个请求。但从同一浏览器发起两个独立请求时,第二个请求耗时20秒才完成,而非预期的10秒。这是对async的理解有误,还是代码存在问题?
[更新]已确认问题源于同一浏览器触发请求。
问题原因
- 你对
async的理解是正确的,代码本身也没有错误:Task.Delay是典型的异步非阻塞操作,API的异步逻辑不会占用线程等待,服务器端完全具备同时处理多个请求的能力。 - 问题出在浏览器的同源请求策略:多数现代浏览器会对同一域名下的相同GET请求(尤其是携带相同凭证如Cookie的请求)进行排队处理,浏览器会等待第一个请求完成后再发送第二个,以此避免重复请求或缓存冲突,最终导致第二个请求的总耗时看起来是20秒。
验证与优化建议
- 验证:使用不同浏览器、Postman、curl等工具同时发起请求,就能看到两个请求均在10秒左右完成,证明服务器端的异步逻辑是并行处理的。
- 代码优化:
return await Task.FromResult(Ok(Products));可简化为return Ok(Products);,Ok()直接返回ActionResult类型,无需额外封装Task.FromResult,不影响功能但代码更简洁。
内容的提问来源于stack exchange,提问作者Jero Lopez
相关产品推荐
相关产品推荐

