在 ASP.NET Core 控制器中,我们需要从数据库获取一些数据。使用 EF Core 我们有以下选项:ToList()
和ToListAsync()
。这是我对两者之间差异的理解,我想知道我是否正确:
- 一个 HTTP 请求到达我们的服务器 (Kestrel)
- 线程将根据请求执行管道
- 在某个时候它会到达我们的控制器,在这里如果我们使用
ToList()
线程,则必须等到数据从数据库中提取出来。根据我们的数据库服务器的位置,这可能非常快(在同一台机器上)或非常慢(地球的另一端),但如果我们使用ToListAsync()
线程,它将被释放,并且有机会接收另一个 HTTP 请求,因此,在为请求 A 获取数据时,释放的线程可能会完成请求 B。
这是我们应该使用异步版本的主要原因。这里要注意的重要一点是,请求 A 不会执行得更快,它实际上执行得更慢一些,因为框架会进行上下文切换。所以,(如果我是对的)我们有机会处理更多的请求,但代价是每个请求的处理速度都慢一点。
所以,我的问题是,如果我们知道获取速度非常快(同一台机器或同一数据中心),并且我们知道没有太多用户发送请求(例如:一个有 15-20 个用户的管理面板网站),那么使用同步版本并避免上下文切换是否真的更好?
简而言之,您的理解可以说是正确的。正如值得一读的.NET 中的异步编程 - 简介、误解和问题文章中所述:
摘自Stephen Toub 所著的《异步编程 - 异步性能:理解 Async 和 Await 的成本》:
至于你的问题:
这里有几个潜在的注意事项:
可以说,如果您的 RPS 较低,那么一般来说您不应该在意,影响应该几乎不可察觉。当然,与所有与性能相关的问题一样,您需要彻底测试您的实际设置(实际硬件、软件和使用/负载模式),但在这个具体案例中,这听起来不值得花时间(除非您对这项任务非常感兴趣,并想尝试一些科学工具/方法/等)。