博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
System.Threading.ThreadAbortException: 正在中止线程。
阅读量:6254 次
发布时间:2019-06-22

本文共 3245 字,大约阅读时间需要 10 分钟。

  hot3.png

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

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

就做了个限制程序!

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

程序大致如下:

  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. }

转载于:https://my.oschina.net/wzzz/blog/493984

你可能感兴趣的文章
动物产生式识别系统
查看>>
python *args **kwargs
查看>>
Jquery UI - DatePicker 在Dialog中无法自动隐藏的解决思路
查看>>
Docker Swarm 让你事半功倍
查看>>
jQuery选择器之子元素过滤选择器Demo
查看>>
LogBoy运行截图
查看>>
string.Format字符串格式说明
查看>>
关于配置Tomcat的URIEncoding
查看>>
【C语言 C++】简单keywordRegister,Const,Static,Volatile,typedef,Define的理解
查看>>
POJ 3518 Prime Gap(素数)
查看>>
[笔记][Java7并发编程实战手冊]3.4 等待多个并发事件的完毕CountDownLatch倒计数闭锁...
查看>>
Java基础(十三):集合
查看>>
c#:使用using关键字自动释放资源未必一定就会有明显好处
查看>>
Python3.6的组件numpy的安装
查看>>
标准SQL语句总结
查看>>
Python的编码问题
查看>>
DirectX怪像之一,我的模型不见了
查看>>
Javascript 打开模式窗口
查看>>
POJ -2513 Colored Sticks 字典树 + 并查集 + 欧拉路
查看>>
【听课笔记】MIT领导力课程笔记:施乐前CEO Anne——在火线上得到的经验
查看>>