【问题标题】:Why am I getting "Thread was being aborted" in ASP.NET?为什么我在 ASP.NET 中得到“线程被中止”?
【发布时间】:2011-10-02 23:44:43
【问题描述】:

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

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

这似乎发生在对System.Threading.WaitHandle.WaitOne 的调用中。我不确定这个异常能走多远。我认为我的线程永远不会终止,因为我会捕获日志并吞下错误。

为什么会出现这些错误?也许是当我强行终止我的服务器或要求它重新启动时?如果不是,那可能是什么原因造成的?

【问题讨论】:

  • 你能显示你在 Application_Start 中的代码吗?
  • @rick:我不知道你希望找到什么,但这里有一个 sn-p。 var obj1=new MyServiceObject(); srv1 = new Thread(obj1.Queue); ... srv1.Start()。请注意, obj1 不在 using 块内,因此不会过早处理。它只是我在启动时产生的一个普通线程
  • 我的猜测是您的 srv1 变量正在失去作用域并杀死线程。您需要等待它完成,或将范围更改为更高级别的范围。 (我意识到这个答案晚了 10 年;但是,我认为其他人可能会看到这个。)我在登录 asp.net 应用程序时遇到了类似的问题——我试图登录一个单独的线程,但线程一直挂掉.在我更改了分配给它的变量的范围后,垃圾收集器不理会它。

标签: asp.net exception


【解决方案1】:

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

【讨论】:

  • 嗯。好的答案+1,但事实并非如此。这实际上发生在我生成的线程(通常来自 Application_Start)上,而不是主请求路径上。
  • 这只是获得 ThreadAbortException 的一种方法 - 你让它听起来像是唯一的方法。例如。也可能是请求花费了 > 90 秒,因此 IIS 将其杀死。
【解决方案2】:

ASP.NET 始终根据需要生成和终止工作进程。您的线程可能刚刚被 ASP.NET 关闭。

旧答案:

已知问题:PRB: ThreadAbortException Occurs If You Use Response.End, Response.Redirect, or Server.Transfer

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

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

【讨论】:

  • 嗯。好的答案+1,但事实并非如此。这实际上发生在我生成的线程上(通常来自 Application_Start),而不是在主请求路径上。
【解决方案3】:

如果您在Application_Start 中生成线程,它们仍将在应用程序池的AppDomain 中执行。

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

发生这种情况时,您从该 AppDomain 开始的任何线程,包括来自 Application_Start 的线程,都将被中止。

在这个问题中有更多关于应用程序池和回收的信息:What exactly is Appdomain recycling

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

【讨论】:

  • 这听起来和正在发生的事情一模一样。我还有一个问题... Application_Start 是否在站点再次变为活动状态时再次运行?看起来不是(但我可能编码错误)
  • 不是。从这里:msdn.microsoft.com/en-us/library/ms178473.aspx“Application_Start 和 Application_End 方法是不代表 HttpApplication 事件的特殊方法。ASP.NET 在应用程序域的生命周期内调用它们一次,而不是针对每个 HttpApplication 实例。”
  • 我看到这种情况发生的时间很少。比如,在背靠背请求之间:/
【解决方案4】:

对于托管在 ASP.NET 中的 Web 服务,配置属性是 executionTimeout:

<configuration> <system.web>

<httpRuntime executionTimeout="360" />

</system.web>

</configuration>

设置这个,线程中止异常就会消失:)

【讨论】:

  • 发现这是进行异步 Web 调用时的修复方法。
  • “设置这个,线程中止异常将消失”.. 几分钟;)
  • 是的,既然 web.config 中只有一行代码,为什么还要为各种代码更改而烦恼。赞成。
  • 但 MSDN 提到 ExecutionTimeout:“此超时仅适用于 元素中的调试属性设置为 false 的情况。”我有 debug=true 但它仍然会发生。
【解决方案5】:

这个问题出现在Response.RedirectServer.Transfer方法中,因为这两个方法都在内部调用Response.End

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

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

访问this link 下载示例。

【讨论】:

    【解决方案6】:

    尝试多次结束响应可能会导致此错误。正如已经提到的其他答案,有多种方法可以结束响应(如Response.EndResponse.Redirect)。如果你连续调用多个,你会得到这个错误。

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

    【讨论】:

    • 很可能,在响应结束后对响应执行任何操作都可能导致此错误。
    【解决方案7】:

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

    我改用FormsAuthentication.RedirectFromLoginPage 来修复它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      相关资源
      最近更新 更多