System.Threading.ThreadAbortException: 正在中止线程。

开发环境为VS2005,OS 为Windows 2003,系统登录后在跳转到另一页面时会报此错误:

在 System.Threading.ThreadAbortException 中第一次偶然出现的“mscorlib.dll”类型的异常
“System.Threading.ThreadAbortException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理

但不影响程序的正常运行。于是在网上查了查,发现相关资料不多。后来找到微软的官方解释,搞定。
--------------------------------------------------------------------------------------------------------------

症状

如果使用 Response.EndResponse.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可照用!

 

 

 

 

做这个网站需要下载软件 可我有不想让 迅雷等工具 下载影响网速.

就做了个限制程序!

可就出现了错误 !   正在中止线程

程序大致如下:

csharp代码
  1. try  
  2. {   
  3.  sting host = context.Request.UrlReferrer.Host;   
  4.  if ( 程序判断)   
  5. {      
  6.  context.Response.Clear();   
  7.  context.Response.ContentType = "application/octet-stream";   
  8.  context.Response.WriteFile(file.FullName);   
  9.  context.Response.End();   
  10. }   
  11. }   
  12. catch (Exception e)   
  13. {   
  14.  HttpContext.Current.Response.Redirect("/default.aspx?key=" + e.Message);   
  15.  context.Response.End();   
  16.   
  17. }  

只有 一执行 Try 里面的东西 就一定出错 e.Message=正在中止线程

研究了一下好像是 Try 执行的时候 context.Response.End(); 就出错

不能把context.Response.End();放在 Try 里面

需要写成:

csharp代码
  1. try  
  2. {   
  3.  sting host = context.Request.UrlReferrer.Host;   
  4. }   
  5. catch (Exception e)   
  6. {   
  7.  HttpContext.Current.Response.Redirect("/default.aspx?key=" + e.Message);   
  8.  context.Response.End();   
  9.   
  10. }   
  11.  if ( 程序判断)   
  12. {      
  13.  context.Response.Clear();   
  14.  context.Response.ContentType = "application/octet-stream";   
  15.  context.Response.WriteFile(file.FullName);   
  16.  context.Response.End();   
  17. }  

你可能感兴趣的:(Asp.Net)