zoukankan      html  css  js  c++  java
  • System.Threading.ThreadAbortException: 正在中止线程。

    在 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可照用!

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

    就做了个限制程序!

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

    程序大致如下:

    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();  
    1. try
    2. sting host = context.Request.UrlReferrer.Host; 
    3. if ( 程序判断) 
    4. {    
    5. context.Response.Clear(); 
    6. context.Response.ContentType = "application/octet-stream"; 
    7. context.Response.WriteFile(file.FullName); 
    8. context.Response.End(); 
    9. catch (Exception e) 
    10. HttpContext.Current.Response.Redirect("/default.aspx?key=" + e.Message); 
    11. context.Response.End(); 

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

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

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

    需要写成:

    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. if ( 程序判断)  
    11. {     
    12. context.Response.Clear();  
    13. context.Response.ContentType = "application/octet-stream";  
    14. context.Response.WriteFile(file.FullName);  
    15. context.Response.End();  
    16. }
  • 相关阅读:
    macOS 10.13 High Sierra PHP开发环境配置
    Mac brew安装redis
    【PHP】进一法取整、四舍五入取整、忽略小数等的取整数方法大全
    解决上传app store卡在正在通过iTunes Store鉴定
    PHP 时间操作
    GO获取随机数
    GO语言数组,切片,MAP总结
    性能规范参考指标
    Jmeter聚合报告理解
    性能概述及技术指南
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/4739408.html
Copyright © 2011-2022 走看看