AThreadAbortException
发生在您的工作线程上,因为其他人调用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 中的设置指定的限制(默认设置为
- 修改了虚拟目录的物理路径
- CAS 政策已修改
- Web 服务已重新启动
- (仅限 2.0)应用程序子目录被删除
该博客文章还包含有关追踪回收发生原因的信息。对于初学者,请尝试查看事件日志 (eventvwr.msc) 以查看是否有任何详细信息。
您也可以尝试直接调试工作进程。将 VS 调试器附加到运行代码的 w3wp.exe 实例,添加断点Thread.Abort
(您可能需要在调试器选项中启用“.NET Framework 源单步执行”),然后Abort
使用调用堆栈查看它的来源窗户。这不会告诉你为什么会这样,但至少你会知道是谁在做的。