ASP.NET: 正在中止线程 错误原及解决方法
#[操作记录]:2010-02-23 9:25:12 System.Threading.ThreadAbortException: 正在中止线程。
症状
如果使用 Response.End、Response.Redirect 或 Server.Transfer 方法,将出现 ThreadAbortException异常。您可以使用 try-catch 语句捕获此异常。原因
<!-- Inject Script Filtered -->
Response.End 方法终止页的执行,并将此执行切换到应用程序的事件管线中的 Application_EndRequest 事件。不执行 Response.End 后面的代码行。此问题出现在 Response.Redirect 和 Server.Transfer 方法中,因为这两种方法均在内部调用Response.End。
解决方案
要解决此问题,请使用下列方法之一:对于 Response.End,调用 HttpContext.Current.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 方法。 |
***********************************************************************
在C#中启用线程后,如果试图使用Abort方法来终止线程,那么必定会抛出“正在终止线程”的异常,一开始我也想过如何来避免这种异常出现,花了不少气力,但最后发现全是徒劳。
原因是一个正在运行的线程被终止在C#的机制中是属于非正常结束,所以必定会爆出异常,所以我们也大可不必因为在代码方面的“洁癖”非得找到一个方法来阻止这种异常出现。
也有人提出采用join()方法来阻止,但很多情况下这并不能完全满足我们的要求,比如我们有一个后台的监听线程,如果我们的确想终止它,如果我们采用了join方法,那么我们不想发生的情况就会出现,我们的界面会因为执行了join而卡死在那里,为什么呢?因为我们的监听线程一般来说都是一个持续运行的线程,所以我们大可不必因为介意爆出异常而采用join的方法而导致程序假死。
我也在网上看见有人提出过,要终止线程最好是在执行线程的代码中自然终止,这个说法本身没有错,但对于我上面说到的监听线程,要自然结束是不可能办到的。
从上面的分析我们可以看出,C#中的线程一旦开启,那么只有等这个线程执行完,自然结束,自然被系统回收才不会爆出异常,任何一种外部的强制中断都会被认为是异常的,任意一个线程在本质上都和我们的主线程(Main函数所在的线程)一样,都必须按照顺序执行完所有的语句方才结束当前线程,如果在所有的语句没有执行完的时候就被终止了,这至少是与我们设计的理想状态有差异的。
所以我觉得在遇到C#中的“正在终止线程”异常的时候,可以大胆的用try{}catch()来处理(丢弃异常信息或将异常友好化),而不是阻止这个异常的出现,阻止这个异常的出现明显有两个坏处:
第一、耗费的代价实在太高
第二、对于线程的干涉手段过于复杂,不便于维护线程
- ASP.NET"正在中止线程"错误原及解决方法
- asp.net MVC + linq to entity报"不允许启动新事务,因为有其他线程正在该会话中运行."错误解决方法
- Asp.net中"正在中止线程"错误解决方法
- ASP.NET "正在中止线程"错误原因及解决方法【转】
- ASP.NET"正在中止线程"错误原因
- ASP.NET: 正在中止线程 错误原及解决方法
- ASP.NET"正在中止线程"错误原因
- ASP.NET"正在中止线程"错误原因
- ASP.NET"正在中止线程"错误原因
- ASP.NET“正在中止线程”错误原因
- Asp.net中建立MS office组件时出现“拒绝访问”和“消息筛选器显示应用程序正在使用中”错误的解决方法
- ASP.net AJAX置于框架中出现JScript运行时错误的解决方法
- 解决ASP.NET创建的线程的用户改变引发的"拒绝访问"错误
- 解决ASP.NET创建的线程的用户改变引发的"拒绝访问"错误
- 用dw(dreamweaver)开发asp.net,连接数据库时出现“http错误500,服务器内部错误”的解决方法
- Asp.net Ajax 中的脚本错误: 'Sys'未定义 的解决方法
- 检测到指定的WEB服务器运行的不是ASP.NET 1.1版,您无法运行ASP.NET应用程序或服务和创建ASP.NET程序时候发生错误 HTTP/1.0 500 Server Error的解决方法
- Asp.net Ajax 中的脚本错误: Sys未定义的解决方法
- ASP.NET常见错误,原因及解决方法(2003版)
- Asp.Net控件加载错误的解决方法