2010-08-25 69 views
6

我在运行在Windows Server 2008 IIS 7.5上的ASP.NET应用程序中产生一个工作线程这个工作线程所做的第一件事是睡N秒,然后完成它的实际工作。在睡眠期间,抓住一个ThreadAbortException。为什么工作线程在睡眠期间线程我的ASP.NET spawn遇到ThreadAbortException?

你能解释一下这种行为吗?你的奖励点可以指向任何可以用来调整行为的IIS/ASP.NET设置。

编辑:更多信息。赶上ThreadAbortException的建议帮助我解决了这个问题,所以谢谢。根据我所学到的内容,我完全重写了这个问题的措辞,但仍然是同一个问题,为什么这个工作者线程在睡眠中被中止?

+0

如果连续两次睡眠17秒或更少,会发生什么情况? – 2010-08-25 01:37:26

+2

为什么不尝试抓住整个线程处理程序,看看会发生什么?很可能你会得到ThreadAbortException,它可能有一些有用的东西。 – 2010-08-25 01:53:45

+0

@Robert - 没问题 @ liho1eye - 会做 – 2010-08-25 02:00:41

回答

6

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

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

  • 的Machine.config,Web.Config中或Global.asax中被修改
  • bin目录或其内容被修改
  • 重新汇编(ASPX,ASCX或ASAX)的数目超过(它被设置为15 默认)
  • pH值通过在machine.config中的 设置或 web.config中指定的限制 虚拟目录的ysical路径修改
  • 的CAS策略将被修改
  • Web服务重新启动
  • (仅2.0)的子应用目录将被删除

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

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

+0

我无法直接调试线程,因为问题发生在主机提供商的机器上,而不是我控制的机器上。我的逻辑不会中止该线程。默认空闲超时以分钟为单位,而当我的线程休眠20秒左右时会发生此问题。没有任何其他的回收理由适用。没有Response.Redirect或Response.End。所以...仍然是一个谜。 – 2010-08-25 12:25:09

+0

刚刚解决了我的问题:我的线程在中间被中止,发生这种情况是因为我正在将日志写入“bin”文件夹(这导致IIS重置)... – Illidan 2014-10-19 15:10:27