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