7

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

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

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

4

1 回答 1

6

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使用调用堆栈查看它的来源窗户。这不会告诉你为什么会这样,但至少你会知道是谁在做的。

于 2010-08-25T04:55:32.980 回答