为什么工作线程我的ASP.NET生成器在睡眠期间遇到ThreadAbortException?

时间:2010-08-25 01:34:36

标签: asp.net iis iis-7.5 windows-server-2008-r2

我在Windows Server 2008,IIS 7.5上运行的ASP.NET应用程序中生成一个工作线程。这个工作线程做的第一件事就是睡眠N秒,然后它才能真正起作用。在睡眠期间,捕获一个ThreadAbortException。

您能否解释一下这种行为,并且您的奖励积分指向了可用于调整行为的任何IIS / ASP.NET设置。

编辑:更多信息。捕获ThreadAbortException的建议帮助我解决了这个问题,谢谢。根据我学到的东西,我完全重写了这个问题的措辞,但同样的问题,为什么这个工作线程在睡眠中会中止?

1 个答案:

答案 0 :(得分:6)

你的工作线程上发生ThreadAbortException,因为有人在其上调用了Thread.Abort,所以它可能与你的工作线程没有直接关系,而是一些外部原因。您应该检查的第一个地方是您自己的代码,您可以执行任何线程管理或中止。否则,对于IIS,这可能是由于工作进程(w3wp.exe)或应用程序池或AppDomain被回收。

回收可能是由于应用程序池的空闲超时设置,定期安排的回收或内存/ CPU使用触发器造成的。这些可通过服务器资源管理器中的IIS配置管理器(在Win 2K8上)或仅运行inetmgr.exe进行配置。根据Tess的博客here,AppDomain回收有很多其他原因:

  
      
  • 修改了Machine.Config,Web.Config或Global.asax
  •   
  • bin目录或其内容已修改
  •   
  • 重新编译的次数(aspx,ascx或asax)超出限制   由...指定   在machine.config中设置或   web.config(默认设置为   15)
  •   
  • 修改虚拟目录的物理路径
  •   
  • CAS政策已修改
  •   
  • 重新启动网络服务
  •   
  • (仅限2.0)应用程序子目录已删除
  •   

该博客文章还提供了有关追踪回收发生原因的信息。对于初学者,请尝试查看事件日志(eventvwr.msc)以查看是否有任何详细信息。

您也可以尝试直接调试工作进程。将VS调试器附加到运行代码的w3wp.exe实例,在Thread.Abort上添加断点(您可能需要在调试器选项中启用“.NET Framework源步进”),并查看{{1来源于使用调用堆栈窗口。这不会告诉你它为什么会发生,但至少你会知道是谁在做这件事。