【发布时间】:2020-02-08 20:50:42
【问题描述】:
我认为,当我们发出异步请求时,线程池中的一个线程将被分配给该请求,当该请求作为 sql 查询进入数据库时,直到查询完成,分配给该请求的线程将被释放然后另一个请求可以使用该线程。
所以我的问题是让我们考虑一下所有线程都已分配给请求并且线程池中没有线程的情况。然后想象一下触发了一个sql查询的回调,以及由于线程池中没有空闲线程,CPU如何处理这个回调。
【问题讨论】:
-
如果超过
ThreadPool.GetMaxThreads()返回的限制,则代码将阻塞,直到另一个线程可用,这是一件坏事。但是,在许多情况下,它不需要创建线程(根据 MickyD 链接的文章)。 -
.NET 有单独的线程池用于 I/O 回调操作(有时称为 I/O 线程池),因此服务于输入请求的工作线程池的耗尽可能有只是对 I/O 线程池的间接影响,这意味着更多的输入请求将导致更多的 I/O 回调。因此,在工作线程池耗尽的情况下,I/O 回调会发生什么主要取决于是否使用了将执行分派给工作线程的同步上下文(它将在前一种情况下等待线程或将后者立即执行)。
标签: c# .net multithreading asynchronous threadpool