在 System.Threading.ThreadAbortException 中第一次偶然出现的“mscorlib.dll”类型的异常
“System.Threading.ThreadAbortException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理
但不影响程序的正常运行。于是在网上查了查,发现相关资料不多。后来找到微软的官方解释,搞定。
--------------------------------------------------------------------------------------------------------------
症状
如果使用 Response.End、Response.Redirect 或 Server.Transfer 方法,则出现 ThreadAbortException 异常。 可使用 try-catch 语句捕捉此异常。
原因
Response.End 方法停止页的执行,并将该执行变换到应用程序的事件管线中的 Application_EndRequest 事件。 Response.End 后面的代码行将不执行。
此问题出现在 Response.Redirect 和 Server.Transfer 方法中,这是由于这两种方法都在内部调用 Response.End。
解决方案
若要解决此问题,请使用下列方法之一:
- 对于 Response.End,调用 ApplicationInstance.CompleteRequest 方法而不调用 Response.End,以便跳过 Application_EndRequest事件的代码执行。
- 对于 Response.Redirect,使用重载 Response.Redirect(String url, bool endResponse),对 endResponse 参数它传递 false以取消对 Response.End 的内部调用。例如:
Response.Redirect ("nextpage.aspx", false);
如果使用这种解决方法,Response.Redirect 后面的代码将得到执行。
- 对于 Server.Transfer,请改用 Server.Execute 方法。
状态
这种现象是设计使然。
又有问题出现了:
在try catch中使用Response.End()抛"线程被中止"异常,Response.Redirect()和Server.Transfer()也会出现这个问题.
如:(
try
{
if (DoSomeThing())
{
Response.End();
//HttpContext.Current.ApplicationInstance.CompleteRequest();
}
//DoOtherThing不写在else里只是为了说明问题
DoOtherThing();
}
catch (System.Threading.ThreadAbortException ex)
{
WirteLog(ex);
}
catch (Exception ex)
{
WirteLog(ex);
}
)
如果不用catch (System.Threading.ThreadAbortException ex),就会抛"线程被中止"异常,
如果不用catch (System.Threading.ThreadAbortException ex),而用HttpContext.Current.ApplicationInstance.CompleteRequest 代替Response.End(),则后面的DoOtherThing()还是会继续执行.
要根据实际需要选择具体做法.
最终解决办法:
(1)、在页面的OnLoad或OnInit中可以使用HttpContext.Current.ApplicationInstance.CompleteRequest()+return来代替Response.End;
(2)、用 Response.Redirect(strUrl,false)+return 来代替 Response.Redirect(strUrl)
(3)、Server.Execute根本代替不了Server.Transfer方法,Server.Execute会将两个页面的代码全部输出。
特别return注意:return语句退出本语句所在的方法,而不能退出子类的方法!千万不要以为在基类页面的OnLoad中检测到了某object==null时就能return此次请求,子类页面的OnLoad就无需检测此object!=null可照用!
做这个网站需要下载软件 可我有不想让 迅雷等工具 下载影响网速.
就做了个限制程序!
可就出现了错误 ! 正在中止线程
程序大致如下:
- try
- {
- sting host = context.Request.UrlReferrer.Host;
- if ( 程序判断)
- {
- context.Response.Clear();
- context.Response.ContentType = "application/octet-stream";
- context.Response.WriteFile(file.FullName);
- context.Response.End();
- }
- }
- catch (Exception e)
- {
- HttpContext.Current.Response.Redirect("/default.aspx?key=" + e.Message);
- context.Response.End();
- }
- try
- {
- sting host = context.Request.UrlReferrer.Host;
- if ( 程序判断)
- {
- context.Response.Clear();
- context.Response.ContentType = "application/octet-stream";
- context.Response.WriteFile(file.FullName);
- context.Response.End();
- }
- }
- catch (Exception e)
- {
- HttpContext.Current.Response.Redirect("/default.aspx?key=" + e.Message);
- context.Response.End();
- }
只有 一执行 Try 里面的东西 就一定出错 e.Message=正在中止线程
研究了一下好像是 Try 执行的时候 context.Response.End(); 就出错
不能把context.Response.End();放在 Try 里面
需要写成:
- try
- {
- sting host = context.Request.UrlReferrer.Host;
- }
- catch (Exception e)
- {
- HttpContext.Current.Response.Redirect("/default.aspx?key=" + e.Message);
- context.Response.End();
- }
- if ( 程序判断)
- {
- context.Response.Clear();
- context.Response.ContentType = "application/octet-stream";
- context.Response.WriteFile(file.FullName);
- context.Response.End();
- }