从Asp.net线程池中获取线程?

时间:2012-05-08 08:30:12

标签: c# asp.net multithreading webforms

当我运行Asp.net(cs文件)页面时:

使用Thread T = new Thread(...)

创建BeginInvoke()

是否从Asp.net保留的线程池中获取线程?

修改

  

基本上,.NET维护着一个可以处理页面的线程池   要求。收到新请求时,ASP.NET会抓取其中一个请求   可用线程并使用它来处理整个页面。同样的   线程实例化页面,运行事件处理代码,以及   返回呈现的HTML。如果ASP.NET快速收到请求   速度快于它可以为它们提供服务 - 未处理的请求将会增加   一个队列。如果队列填满,ASP.NET将被拒绝拒绝   请求503“服务器不可用”错误。

我不想影响Asp.net“请求线程......”

enter image description here

1 个答案:

答案 0 :(得分:4)

当您使用new Thread()时,它实际上会创建一个与ThreadPool无关的新线程。

使用Delegate.BeginInvoke()时,委托在.Net ThreadPool上执行(没有特殊的ASP.NET ThreadPool)。

通常情况下,如果您使用ThreadPool执行短期运行任务,并且需要运行长时间运行的任务,则最好手动创建线程。另一种选择是使用.Net 4.0 Task,它为您提供更好,更一致的API。 CPU绑定Task通常在ThreaPool上运行,但您可以指定LongRunning选项,以便他们创建自己的线程。

一般情况下,您可能不必担心即使在ASP.NET应用程序中也会使ThreadPool挨饿,因为限制足够高(至少在.Net 4.0中,它们在之前的某些程度上有所降低)版本)。如果确实遇到这些问题,可以尝试增加ThreadPool中的线程数,或者可以使用单独的线程池(这需要一些代码,但是你应该可以在互联网)。如果您使用Task,则使用自定义线程池会更容易,因为这意味着只需切换TaskScheduler