假设.NET框架维护了一个用于服务ASP.NET请求的线程池( .NET 4.5的默认线程池是5,000)。据说,长时间运行的高并发请求的大型应用程序可能会导致称为线程饥饿的情况。因此,应该对高延迟调用发出异步请求,以释放请求线程。
但是异步请求不是无论如何都会从线程池中产生另一个线程来完成它的工作吗?新线程是否来自与请求线程池不同的池,以及创建这些线程的数量是否有限制?
发布于 2013-06-06 05:22:07
,但是异步请求不会从线程池中产生另一个线程来完成它的工作吗?
是的,但只有在异步工作完成之后。当工作完成时(通常意味着等待磁盘或网络),异步代码不会阻塞线程。
新线程是否来自与请求线程池不同的池,以及创建这些线程的数量是否有限制?
ASP.NET没有单独的线程池。异步代码和ASP.NET使用相同的线程池,这意味着它们也共享相同的限制。
线程的限制并不是唯一的问题(如果是这样的话,您可以调用ThreadPool.SetMaxThreads()来增加它)。其他问题是每个线程使用1MB的内存,这对于32位应用程序来说是特别有问题的。此外,由于上下文切换,同时执行太多线程的效率很低。
https://stackoverflow.com/questions/16949226
复制相似问题