2013-06-05 34 views
3

假设.NET Framework维护用于为ASP.NET请求提供服务的线程池(.NET 4.5的默认值为5,000)。据说具有长时间运行请求的高并发性的大应用程序可能导致称为线程匮乏的情况。因此,应该对高延迟调用进行异步请求以释放请求线程。ASP.NET中的线程和请求线程池

但是不是异步请求从线程池产生另一个线程来完成它的工作?新线程是否来自与请求线程池不同的池,并且可以创建多少个线程的限制?

+0

你有一些参考,给一些例子,一些博客,从现实生活中的东西? – Aristos

回答

1

但是不是异步请求从线程池中产生另一个线程来完成它的工作吗?

是的,但只有在异步工作完成后。当工作正在完成(通常意味着等待磁盘或网络)时,异步代码不会阻塞线程。

新线程是否来自与请求线程池不同的池,并且是否存在对可以创建多少线程的限制?

ASP.NET没有单独的线程池。异步代码和ASP.NET使用相同的线程池,这意味着它们也具有相同的限制。

线程的限制不是唯一的问题(如果是的话,你可以拨打ThreadPool.SetMaxThreads()来增加它)。其他问题是每个线程使用1 MB内存,这对于32位应用程序尤其有问题。而且,由于上下文切换,同时执行太多线程效率低下。

+0

你能否详细说明“是的,但只有在异步工作完成后”?如果我使用这个人造的例子作为异步方法: Thread.Sleep(5000); int threadId = Thread.CurrentThread.ManagedThreadId;根据你的意思,将threadId为空,因为这种异步方法尚未完成? – jodev

+0

@jodev不,但这不是一个真正的异步方法。你的方法会阻塞整个5秒的线程。如果你改用'await Task.Delay(5000); int threadId = Thread.CurrentThread.ManagedThreadId;',那么对于那5秒钟,那个方法将不会使用线程。但是下面这行会在某个线程上执行,'ManagedThreadId'永远不会返回'null',或者类似的东西。 – svick

+0

谢谢,更有意义。 – jodev