DBMNG数据库管理与应用

科学是实事求是的学问,来不得半点虚假。
当前位置:首页 > 服务器配置 > IIS&ASP

“System.Threading.ThreadAbortException: 正在中止线程”问题解决方案

在 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();  

}



From:转载来源


本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号