为什么我会得到;“线程正在中止”;在ASP.NET中?

为什么我会得到;“线程正在中止”;在ASP.NET中?,asp.net,exception,Asp.net,Exception,我不知道为什么会发生这种情况,而且我从未明确中止线程,所以这有点令人惊讶。但我记录了异常,我看到: System.Threading.ThreadAbortException-正在中止线程 它似乎发生在对System.Threading.WaitHandle.WaitOne的调用中。我不确定这一例外会有多严重。我认为我的线程永远不会终止,因为我捕获日志并接受错误 为什么我会犯这些错误?也许是在我强制终止服务器或要求它重新启动时?如果不是,那么是什么原因导致了这些异常?不是,线程异常是由一个简单的

我不知道为什么会发生这种情况,而且我从未明确中止线程,所以这有点令人惊讶。但我记录了异常,我看到:

System.Threading.ThreadAbortException-正在中止线程

它似乎发生在对
System.Threading.WaitHandle.WaitOne
的调用中。我不确定这一例外会有多严重。我认为我的线程永远不会终止,因为我捕获日志并接受错误


为什么我会犯这些错误?也许是在我强制终止服务器或要求它重新启动时?如果不是,那么是什么原因导致了这些异常?

不是,
线程异常是由一个简单的引发的。ASP.NET会根据需要随时生成和终止工作进程。您的线程可能正被ASP.NET关闭

旧答案:

已知问题:


如果在
Application\u Start
中生成线程,它们仍将在应用程序池的
AppDomain
中执行

如果应用程序空闲一段时间(意味着没有请求进入),或者满足某些其他条件,
ASP.NET
将回收整个
AppDomain

发生这种情况时,从该
AppDomain
启动的所有线程,包括从
Application\u Start
启动的线程,都将被中止

有关应用程序池和回收的更多信息,请参见本问题:


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

此问题发生在
响应中。重定向
服务器.Transfer
方法,因为这两种方法都在内部调用
响应.End

这个问题的解决办法如下

对于
Server.Transfer
,请使用
Server.Execute
方法


访问下载示例。

对于ASP.NET中托管的web服务,配置属性为executionTimeout:

<configuration> <system.web>

<httpRuntime executionTimeout="360" />

</system.web>

</configuration>


设置此选项,线程中止异常将消失:)

此错误可能是由于多次尝试结束响应造成的。正如前面提到的其他答案一样,有多种方法可以结束响应(如
response.end
,或
response.Redirect
)。如果您连续调用多个,将出现此错误


我在尝试使用
响应时遇到此错误。在使用
响应后结束
。TransmitFile
似乎也会结束响应。

我在执行
响应时遇到此错误。在用户成功登录后重定向


我通过执行
表单验证来修复它。改为从登录页面重定向。

嗯。回答好+1,但不是这样。这实际上发生在我生成的线程上(通常从应用程序开始),而不是在主请求路径上。好答案+1,但不是这样。这实际上发生在我生成的线程上(通常是从应用程序_开始),而不是在主请求路径上。这只是获得ThreadAbortException的一种方法——你让它听起来像是唯一的方法。例如,也可能是一个请求花费了90秒以上,所以IIS将其终止。你能在应用程序_Start中显示你的代码吗?@rick:我不知道你希望找到什么,但这里有一个片段<代码>var obj1=new myservicecobject();srv1=新线程(obj1.Queue)。。。srv1.Start()
。请注意,obj1不在using块内,因此不会过早地对其进行处理。这只是我在Startup上生成的一个普通线程,我猜您的srv1变量正在失去作用域并终止该线程。您需要等待它完成,或者将范围更改为更高级别的范围。(我意识到这个答案已经晚了10年;但是,我想其他人可能会看到。)我在登录asp.net应用程序时遇到了类似的问题——我试图登录一个单独的线程,但该线程一直在消亡。在我更改了分配给它的变量的作用域后,垃圾回收器就不处理它了。这听起来和正在发生的事情一模一样。我还有一个问题。。。当站点再次激活时,应用程序是否再次运行?看起来不是(但我可能编错了代码),不是。从这里开始:“Application_Start和Application_End方法是不表示HttpApplication事件的特殊方法。ASP.NET在应用程序域的生命周期内调用它们一次,而不是为每个HttpApplication实例调用一次。”我看到这种情况在很少的空闲时间内发生。例如,在背对背请求之间:/在执行异步web调用时发现这是修复方法。“设置此选项,线程中止异常将消失”。。几分钟;)是的,当web.config中只有一行代码进行更改时,为什么还要麻烦进行各种代码更改呢。但是MSDN提到了ExecutionTimeout:“只有当元素中的debug属性设置为false时,才会应用此超时。”我有debug=true,但它仍然会发生。很有可能,在响应结束后对其执行任何操作都会导致此错误。
try
{
    Response.Redirect("bla.aspx");
}
catch (ThreadAbortException ex)
{
}
<configuration> <system.web>

<httpRuntime executionTimeout="360" />

</system.web>

</configuration>