繁体   English   中英

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

[英]Threads being taken from the Asp.net Thread pool?

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

并创建Thread T = new Thread(...) 使用BeginInvoke()

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

编辑

从本质上讲,.NET维护着一个可以处理页面请求的线程池。 收到新请求时,ASP.NET会抓取其中一个可用线程并使用它来处理整个页面。 同一个线程实例化页面,运行事件处理代码,并返回呈现的HTML。 如果ASP.NET以快速的速度接收请求,而不是为它们提供服务,则未处理的请求将在队列中累积。 如果队列填满,ASP.NET将被强制拒绝具有503“服务器不可用”错误的其他请求。

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

在此输入图像描述

当您使用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中的ThreadPool ,或者你可以使用一个单独的线程池(这将需要一些代码,但你应该能够在互联网上找到这个代码)。 如果使用Task ,则使用自定义线程池会更容易,因为这意味着只需切换TaskScheduler

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM