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