在下面的代码中,someFunctionCall()有时会生成“Thread is aborted”异常。为什么代码块B中的代码永远不会运行? ASP.NET是否为每个方法调用启动一个新线程?我很惊讶地发现,当这个异常发生时,块b中的代码永远不会运行,该方法返回,并且我的应用程序继续运行。有人可以解释一下吗?
感谢。
public void method()
{
// CODE BLOCK A
//...
try
{
someFunctionCall(); // this call is generating thread abort exception
}
catch(Exception ex)
{
// log exception message
}
// CODE BLOCK B
// ...
}
答案 0 :(得分:32)
这是ThreadAbortException
;它是一个特殊的异常,会在每个catch块的末尾自动重新抛出,除非您调用Thread.ResetAbort()
。
ASP {.Net方法,如Response.End
或Response.Redirect
(除非您通过false
)将此异常抛给当前页面的结束处理;你的someFunctionCall()
可能正在调用其中一种方法。
ASP .Net本身处理此异常并调用ResetAbort
继续处理。
答案 1 :(得分:1)
要解决此问题,请使用以下方法之一:
对于Response.End
,请调用HttpContext.Current.ApplicationInstance.CompleteRequest
方法而不是Response.End
来绕过代码执行到Application_EndRequest
事件。
对于Response.Redirect
,请使用为Response.Redirect(String url, bool endResponse)
参数传递false的重载endResponse
来禁止对Response.End
的内部调用。例如:
Response.Redirect ("nextpage.aspx", false);
如果使用此解决方法,则会执行Response.Redirect
后面的代码。
对于Server.Transfer
,请改用Server.Execute
方法。
答案 2 :(得分:0)
对我有用的是增加IIS上应用程序池的“空闲超时(分钟)”属性。
我将其设置为最大值“ 43200”。
我还调整了回收设置...
答案 3 :(得分:-2)
尝试这种方式:
这是我的扩展方法:
public static void WriteJSONObject(this HttpResponse response, object content) {
response.ContentType = "application/json";
response.Write(new JavaScriptSerializer().Serialize(content));
response.End();
}
逻辑:
public void RegisterUser() {
try {
Response.WriteJSONObject(new { Result = "See hello" });
}
catch (Exception err) {
if (err.Message != "Thread was being aborted.")
Response.WriteJSONObject(new { Result = err.Message });
else {
Response.End();
}
}
}