ASP.NET中的线程和请求线程池
假定.NET Framework维护一个线程池(默认的.NET 4.5为5000),用于服务ASP.NET请求。据说,具有长时间运行请求的高并发性的大型应用程序可能会导致一种称为线程饥饿的情况。因此,应该对高延迟调用发出异步请求,以释放请求线程 但是异步请求是否会从线程池中产生另一个线程来完成其工作?新线程是否来自与请求线程池不同的池,并且可以创建的线程数量是否有限制 但是异步请求是否会从线程池中产生另一个线程来完成其工作 是的,但只有在异步工作完成之后。在工作完成时(通常意味着等待磁盘或网络),异步代码不会阻塞线程 新线程是否来自与请求线程池不同的池,并且可以创建的线程数量是否有限制 ASP.NET没有单独的线程池。异步代码和ASP.NET使用相同的线程池,这意味着它们也共享相同的限制ASP.NET中的线程和请求线程池,asp.net,async-await,Asp.net,Async Await,假定.NET Framework维护一个线程池(默认的.NET 4.5为5000),用于服务ASP.NET请求。据说,具有长时间运行请求的高并发性的大型应用程序可能会导致一种称为线程饥饿的情况。因此,应该对高延迟调用发出异步请求,以释放请求线程 但是异步请求是否会从线程池中产生另一个线程来完成其工作?新线程是否来自与请求线程池不同的池,并且可以创建的线程数量是否有限制 但是异步请求是否会从线程池中产生另一个线程来完成其工作 是的,但只有在异步工作完成之后。在工作完成时(通常意味着等待磁盘或网络)
对线程的限制并不是唯一的问题(如果是的话,您可以通过调用来增加它)。另一个问题是每个线程使用1MB内存,这对于32位应用程序来说尤其有问题。此外,由于上下文切换,同时执行太多线程是低效的。您是否有一些参考资料、一些示例、一些博客或现实生活中的一些内容?您能否详细说明“是的,但只有在异步工作完成后”吗?如果我使用这个人为的例子作为异步方法:Thread.Sleep(5000);int threadId=Thread.CurrentThread.ManagedThreadId;根据您所说的,threadId是否会为null,因为此异步方法尚未完成?@jodev否,但这不是一个真正的异步方法。您的方法将在整个5秒钟内阻止一个线程。如果改为使用
等待任务延迟(5000);int threadId=Thread.CurrentThread.ManagedThreadId代码>,则在这5秒钟内,该方法不会使用任何线程。但是下面这行代码可能会在某些线程上执行,ManagedThreadId
永远不能返回null
,或者类似的任何内容。谢谢,这更有意义。这里有一篇解释异步任务不必使用后台线程的文章: