![]() |
1
8
首先,ASP.NET线程池和CLR线程池没有区别。ASP.NET处理CLR线程池中的页,因此您的ASP.NET页将始终具有IsThreadPoolThread==true。 我很好奇你是如何创建线程的。您使用的是System.Threading.Thread构造函数,还是ThreadPool.QueueUserWorkItem?如果使用的是thread pool.QueueUserWorkItem,则获得的线程来自常规的.net线程池。 最后,就像我一样 posted before ,从ASP.NET中尝试长时间运行的任务总是一个坏主意。我的一般建议是使用后台windows服务来处理这些请求,因为ASP.NET可能会在任何时候终止您的后台线程。如果必须在IIS中执行此操作,请在此处提供更多详细信息: http://csharpfeeds.com/post/5415/Dont_use_the_ThreadPool_in_ASP.NET.aspx |
![]() |
2
4
虽然有一点需要做的是尽量减少对事务的影响,并满足分布式事务中不可预见的情况,但在本例中,仅仅因为进程是长时间运行的,所以实际上并不需要重新创建IIS。整个“它随时都可能死去”的模因被夸大了。 是的,您可以手动重新启动IIS或应用程序池,但您也可以重新启动执行相同作业以获得相同效果的任何其他服务。至于自动回收,IIS使用重叠的工作进程,并且不会强制终止已启动的线程(除非发生超时)。如果是这样的话,我们在任何托管应用程序上都会遇到严重的问题(如何阻止IIS在启动后0.001ms杀死快速响应线程)
本质上,让I I s做IIS最擅长的事情,不要坚持同步操作,你只会浪费池的线程等待阻塞I/O,这是我相信你正在努力避免的。您已经选择了异步处理程序(ASHX),使用
Use Threads and Build Asynchronous Handlers in Your Server-Side Web Code |
![]() |
3
2
实际上,ASP.NET中的线程有一个区别:工作线程和IO线程(我相信您将其称为CLR线程的系统线程)。 现在,ASP.NET在每个请求上都使用一个工作线程,除非使用自定义配置,并且这些工作线程的CPU数量受到限制;可以在IIS中设置此配置。 例如,当您使用委托在ASP.NET中启动异步任务时,您正在使用另一个工作线程。委托是在.NET中启动异步程序的一种快速而肮脏的方式:) 如果你想启动一个新的线程而不使用一个工作线程,那么你必须显式地启动一个新的线程,比如:new thread()….等等。现在这是一个alot代码管理,并且不遵循基于事件的异步模式。 但是有一种方法可以安全地启动异步线程,那就是在对象上使用.NETs自己的异步方法。通常使用asynch的东西,比如SQL命令、webservice调用等等。所有这些都有一个BEGIN和END方法。 通过使用这些方法,您将永远不会使用工作线程,而是使用IO线程。 当谈到异步页面时,ASP.NET有一些技巧。 有两种选择:
我不知道所有的细节,但请看看MSDN库上的两个选项。 以下是一篇关于这个主题的文章: asynch programmin |