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
的起源位置调用堆栈窗口。这不会告诉你为什么会发生,但至少你会知道谁在做。
如果连续两次睡眠17秒或更少,会发生什么情况? – 2010-08-25 01:37:26
为什么不尝试抓住整个线程处理程序,看看会发生什么?很可能你会得到ThreadAbortException,它可能有一些有用的东西。 – 2010-08-25 01:53:45
@Robert - 没问题 @ liho1eye - 会做 – 2010-08-25 02:00:41