在 ASP.NET Core 控制器中,我们需要从数据库获取一些数据。使用 EF Core 我们有以下选项:ToList()
和ToListAsync()
。这是我对两者之间差异的理解,我想知道我是否正确:
- 一个 HTTP 请求到达我们的服务器 (Kestrel)
- 线程将根据请求执行管道
- 在某个时候它会到达我们的控制器,在这里如果我们使用
ToList()
线程,则必须等到数据从数据库中提取出来。根据我们的数据库服务器的位置,这可能非常快(在同一台机器上)或非常慢(地球的另一端),但如果我们使用ToListAsync()
线程,它将被释放,并且有机会接收另一个 HTTP 请求,因此,在为请求 A 获取数据时,释放的线程可能会完成请求 B。
这是我们应该使用异步版本的主要原因。这里要注意的重要一点是,请求 A 不会执行得更快,它实际上执行得更慢一些,因为框架会进行上下文切换。所以,(如果我是对的)我们有机会处理更多的请求,但代价是每个请求的处理速度都慢一点。
所以,我的问题是,如果我们知道获取速度非常快(同一台机器或同一数据中心),并且我们知道没有太多用户发送请求(例如:一个有 15-20 个用户的管理面板网站),那么使用同步版本并避免上下文切换是否真的更好?