假设 .NET Framework 维护一个线程池(.NET 4.5 的默认值为 5,000),用于为 ASP.NET 请求提供服务。据说具有高并发长时间运行请求的大型应用程序可能会导致称为线程饥饿的情况。因此,应该为高延迟调用发出异步请求以释放请求线程。
但是异步请求不会从线程池中产生另一个线程来完成它的工作吗?新线程是否来自与请求线程池不同的池,可以创建多少个这些线程是否有限制?
假设 .NET Framework 维护一个线程池(.NET 4.5 的默认值为 5,000),用于为 ASP.NET 请求提供服务。据说具有高并发长时间运行请求的大型应用程序可能会导致称为线程饥饿的情况。因此,应该为高延迟调用发出异步请求以释放请求线程。
但是异步请求不会从线程池中产生另一个线程来完成它的工作吗?新线程是否来自与请求线程池不同的池,可以创建多少个这些线程是否有限制?
但是异步请求不会从线程池中产生另一个线程来完成它的工作吗?
是的,但只有在异步工作完成之后。当工作完成时(这通常意味着等待磁盘或网络),异步代码不会阻塞线程。
新线程是否来自与请求线程池不同的池,可以创建多少个这些线程是否有限制?
ASP.NET 没有单独的线程池。异步代码和 ASP.NET 使用相同的线程池,这意味着它们也共享相同的限制。
线程的限制并不是唯一的问题(如果是,你可以打电话ThreadPool.SetMaxThreads()
来增加它)。其他问题是每个线程使用 1 MB 内存,这对于 32 位应用程序尤其成问题。此外,由于上下文切换,同时执行太多线程效率低下。