为什么我在asp.net中得到“线程被中止”?

我不知道为什么发生这种情况,我从来没有明确地放弃线程,所以有点意外。 但是,我loggingexception,我看到:

System.Threading.ThreadAbortException – 线程被中止。

它似乎发生在调用System.Threading.WaitHandle.WaitOne 。 我不知道这个例外有多远。 我不认为我的线程终止,因为我抓住日志并吞下错误。

有谁知道我为什么得到这些错误? 也许是当我强迫终止我的服务器或要求重启? 如果不是那么可能导致他们?

不, ThreadAbortException由一个简单的Response.Redirect抛出

如果您在Application_Start中产生线程,它们仍将在应用程序池的AppDomain中执行。 如果应用程序闲置一段时间(意味着没有请求进入),或者某些其他条件满足,ASP.NET将回收整个AppDomain。 当发生这种情况时,从该AppDomain开始的任何线程(包括Application_Start中的线程)将被中止。

在这个问题上有更多的应用程序池和回收: 什么是AppDomain回收

如果您想在IIS / ASP.NET中运行一个长时间运行的过程,简短的答案通常是“不要”。 这就是Windows服务的用途。

ASP.NET根据需要随时产生并终止工作进程。 您的线程可能只是由ASP.NETclosures。

老答案:

已知问题: PRB:如果使用Response.End,Response.Redirect或Server.Transfer,则会发生ThreadAbortException

 Response.Redirect ("bla.aspx", false); 

要么

 try { Response.Redirect("bla.aspx"); } catch (ThreadAbortException ex) { } 

对于ASP.NET中托pipe的Web服务,configuration属性是executionTimeout:

 <configuration> <system.web> <httpRuntime executionTimeout="360" /> </system.web> </configuration> 

设置这个和线程中止exception将消失:)

Response.RedirectServer.Transfer方法中会发生此问题,因为这两个方法在内部调用Response.End

这个问题的解决方法如下。

对于Server.Transfer ,请改用Server.Execute方法。

请访问此链接下载示例。

尝试多次结束响应可能导致此错误。 正如已经提到的其他答案有各种方法,将结束响应(如Response.End ,或Response.Redirect )。 如果你连续打电话多一个,你会得到这个错误。

我在使用Response.End之后尝试使用Response.End时,遇到了这个错误,而且似乎也会结束响应。

我在用户成功login后执行Response.Redirect时出现此错误。

我通过改变FormsAuthentication.RedirectFromLoginPage来修复它。