
HTTP API vs WebSocket API:选择哪个来实现实时通信?
在现代应用中,数据库调用 和 网络请求 往往是最慢的操作,就像计算机世界里的“乌龟”。即使不断堆硬件,也无法彻底解决根本问题。
借助 async/await,我们可以在等待慢操作时,让服务器同时处理其他任务,从而大幅提高吞吐量。
同步 vs 异步
核心关键词
async
:仅标记方法为异步,供开发者阅读,无实际功能。Task
:异步方法的返回类型,用来承载执行结果。await
:让方法在此处“异步挂起”,等待内部耗时操作完成后再继续。我们以 GetStocks
(List 端点)为例,演示如何改造:
// 原同步方法:
// public ActionResult<IEnumerable<Stock>> GetStocks() =>
// _context.Stocks.ToList();
// 改造后:
[HttpGet]
public async Task<ActionResult<IEnumerable<Stock>>> GetStocksAsync()
{
var stocks = await _context.Stocks.ToListAsync();
return stocks;
}
Async
后缀并声明 async
。Task
。await
,并使用 EF Core 的异步版本,如 ToListAsync()
。同样思路,用异步版本替换同步调用:
[HttpGet("{id}")]
public async Task<ActionResult<Stock>> GetStockAsync(int id)
{
var stock = await _context.Stocks.FindAsync(id);
if (stock == null)
return NotFound();
return stock;
}
FindAsync
而非 Find
,并在前面加 await
。其他操作(POST/PUT):
[HttpPost]
public async Task<ActionResult<Stock>> CreateStockAsync(Stock stock)
{
_context.Stocks.Add(stock);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetStockAsync), new { id = stock.Id }, stock);
}
SaveChangesAsync
)也需 await
。注意 DELETE 操作:
Remove
方法本身是同步的,不要在其上使用 await
,只需对 SaveChangesAsync
添加 await
即可。
async
、Task
与 await
的作用及原理。下一步可探索:异步流(IAsyncEnumerable)、并发限制 与 CancellationToken 等高级异步特性。祝编码顺利、高效!
原文引自YouTube视频:https://www.youtube.com/watch?v=Ao2-wILGkPU