如何在ASP.NET页面中从CLR线程池创建线程,而不是ASP.NET池?

3
如果我在ASP.NET页面上创建新线程,则 IsThreadPoolThread 属性为true。 第一个问题是,它来自ASP.NET池还是CLR池? 第二个问题是,如果它来自ASP.NET池,则如何从CLR创建线程并且不使用ASP.NET池? 对于长时间运行的请求,我需要一个同步解决方案(完整内容)。
3个回答

8
首先,ASP.NET线程池和CLR线程池之间没有区别。 ASP.NET在CLR线程池上处理页面,因此您的ASP.NET页面将始终具有IsThreadPoolThread == true。
我很好奇您如何创建线程。 您是使用System.Threading.Thread构造函数还是使用ThreadPool.QueueUserWorkItem? 如果您正在使用ThreadPool.QueueUserWorkItem,则获取的线程来自常规的.net线程池。
最后,正如我以前发布的链接,尝试从ASP.NET内部执行长时间运行的任务总是一个坏主意。 我的一般建议是使用后台Windows服务来处理这些请求,因为ASP.NET可能会在任何时候终止您的后台线程。 如果必须在IIS中执行此操作,请参阅此处的更多详细信息:http://csharpfeeds.com/post/5415/Dont_use_the_ThreadPool_in_ASP.NET.aspx

从asp.net手动构建新线程肯定不会导致IsThreadPoolThread被设置为true,对吧?所以他一定是在调用QueueUserWorkItem。如果我错了,请纠正我。 - Fantius
没错,我只是为了自己的心理安慰在断言。 - Chris Shain
对于那些线程,IsThreadPoolThread 应该为 false。你确定它返回的是 true 吗? - Chris Shain
这里有更多内容:http://dotnetkicks.com/aspnet/Don_t_use_theThreadPool_in_ASP_NET,http://madskristensen.net/post/Done28099t-use-theThreadPool-in-ASPNET.aspx。 - Chris Shain

4
虽然在分布式事务中最小化对事务的影响并考虑意外情况是有道理的,但在这个例子中,没有必要重新发明IIS,只因为进程运行时间很长。整个"IIS随时可能挂掉"的梗被夸大了。是的,您可以手动重启IIS或应用程序池,但您也可以重启任何其他执行相同作业的服务以获得相同的效果。至于自动回收,IIS使用重叠的工作进程,并且永远不会强制终止已经启动的线程(除非超时发生)。如果是这种情况,我们将面临任何托管应用程序的严重问题(IIS在启动0.001ms后阻止快速响应线程的方法是什么)。
实质上,让IIS做最好的IIS,不要坚持同步操作,这样您只会浪费池中的线程等待阻塞I/O,这正是您想要避免的。您已经通过采用异步处理程序(ASHX)做出了一个好选择,使用IHttpAsyncHandler实现来生成您的自定义线程,它会一直阻塞到您需要的程度,而不会影响Web应用程序和其池。一旦您启动异步操作线程,asp.net线程将返回到自己的池中,并准备开始服务新请求。默认情况下,池中有100个线程限制,鉴于您的进程低CPU高带宽,我怀疑您在用完管道空间之前就会耗尽池线程: )。有关如何构建异步处理程序的更多信息,请查看此链接(虽然是旧文章但仍然有效):Use Threads and Build Asynchronous Handlers in Your Server-Side Web Code

2
实际上,在ASP .NET中有两种不同的线程:工作线程和IO线程(我相信您所说的CLR线程就是系统线程)。
现在,除非使用自定义配置,否则ASP .NET在每个请求上使用一个工作线程,并且这些工作线程受到CPU数量的限制;此配置可以在IIS中设置。 当您在ASP.NET中使用委托启动异步任务时,您正在使用另一个工作线程。委托是在.NET中快速启动异步操作的方法:)
如果您想启动一个不使用工作线程的新线程,则必须显式地启动一个新线程,例如:new Thread()....等。现在,这需要大量的代码管理,并且不遵循基于事件的异步模式。 但是,有一种方法可以安全地启动异步线程,那就是使用.NET对象的异步方法。您通常会使用异步方法来执行SQL命令、调用Web服务等。所有这些方法都有BEGIN和END方法。 通过使用这些方法,您将永远不会使用工作线程,而是使用IO线程。
当涉及到异步页面时,ASP .NET有一些技巧。 有两种选择:
异步页面:允许您的页面循环变为异步。这基本上意味着页面是异步请求的。
异步页面任务:让您定义在页面启动时异步触发的任务。它有点像异步线程,只是ASP .NET为您做了很多事情,并且更受限制。
我没有所有细节,请查看MSDN Library上的这两个选项。这里有一篇关于该主题的文章:asynch programming

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接