【发布时间】:2020-09-12 04:46:57
【问题描述】:
我通常在我的 Web 应用程序中使用许多 EF Core 异步方法,如下所示:
await db.Parents.FirstOrDefaultAsync(p => p.Id == id);
我们知道,ThreadPool 中的初始线程数默认限制为 CPU 逻辑核心数。用户请求也由ThreadPool 中的线程处理。
我是否应该担心由于我的应用程序中有许多异步调用而处理用户请求或性能问题?
【问题讨论】:
-
默认情况下,ThreadPool 被限制为最多 32767 个工作线程和最多 1000 个完成端口线程
-
@SirRufo 这个数字是 MaxLimit Rufo,但是我在问题中提到的应用程序启动时生成的默认线程数
-
因为这是一个 DB 调用,所以它是 IO 绑定的,所以它会在与 DB 进行 IO 时释放线程,然后它会安排代码运行之后。这可能会在原始线程上拾取或被线程池线程拾取,但无论哪种方式,这都不会产生一些新线程来执行数据库调用。
-
等待
DbContext上的异步方法NOT会导致使用线程池或其他线程上的任何其他线程。 -
使用异步重载查询数据库将使处理请求的线程能够服务另一个请求,而不是等待结果从数据库返回。这通常是一件好事,但可能会有一些陷阱,正如@David Browne - Microsoft 的回答中提到的那样。等待的任务完成后,异步方法的其余部分将在 ASP.NET Core 应用程序上下文中的线程池线程上执行。这显然需要一个免费的。在 GUI 应用程序中,它在调度程序线程上执行。
标签: c# asp.net entity-framework async-await threadpool