当我运行Asp.net(cs文件)页面时:
使用Thread T = new Thread(...)
BeginInvoke()
或
是否从Asp.net保留的线程池中获取线程?
基本上,.NET维护着一个可以处理页面的线程池 要求。收到新请求时,ASP.NET会抓取其中一个请求 可用线程并使用它来处理整个页面。同样的 线程实例化页面,运行事件处理代码,以及 返回呈现的HTML。如果ASP.NET快速收到请求 速度快于它可以为它们提供服务 - 未处理的请求将会增加 一个队列。如果队列填满,ASP.NET将被拒绝拒绝 请求503“服务器不可用”错误。
我不想影响Asp.net“请求线程......”
答案 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
。