持续发生的 mscorlib.dll 中发生 System.Threading.ThreadAbortException
Posted
技术标签:
【中文标题】持续发生的 mscorlib.dll 中发生 System.Threading.ThreadAbortException【英文标题】:System.Threading.ThreadAbortException occurred in mscorlib.dll occuring persitently 【发布时间】:2013-10-08 12:42:45 【问题描述】:我是 .net 新手, 我使用以下代码从 gridview 转移到 excel:
protected void toexcelbutton_Click(object sender, EventArgs e)
Response.ClearContent();
Response.Buffer = true;
Response.AddHeader("content-disposition", string.Format("attachment; filename=0", "attendancedatereport.xls"));
Response.ContentType = "application/ms-excel";
StringWriter sw = new StringWriter();
htmlTextWriter htw = new HtmlTextWriter(sw);
GridView1.AllowPaging = false;
GridView1.AllowSorting = false;
GridView1.DataBind();
HtmlForm htmfrm = new HtmlForm();
GridView1.Parent.Controls.Add(htmfrm);
htmfrm.Attributes["runat"] = "server";
htmfrm.Controls.Add(GridView1);
htmfrm.RenderControl(htw);
Response.Write(sw.ToString());
HttpContext.Current.ApplicationInstance.CompleteRequest();
当我运行这段代码时,我得到一个异常:
在 mscorlib.dll 中发生了“System.Threading.ThreadAbortException”类型的第一次机会异常。
但是,当我在另一个页面中为另一个 gridview 运行相同的代码时,它可以完美运行。,我尝试了,添加
EnableEventValidation="false"
到 aspx 页面,并且
<pre lang="cs">public override void VerifyRenderingInServerForm(Control control)
/* Verifies that the control is rendered */
</pre>
到 aspx.cs 页面,
我尝试清除临时文件,但我仍然收到相同的错误,我尝试了 5 个多小时,但没有任何效果。
然后我尝试选择 Debug -> Exceptions 菜单项,并在出现的对话框中选中“Common Language Runtime Exceptions,
我得到这个错误:
拒绝访问路径“C:\Users\abcd\AppData\Local\Temp\Temporary ASP.NET Files\mark\3f229106\f785abea\App_Web_0h5ppn4m.dll”。
【问题讨论】:
【参考方案1】:是的,它会因为这个而发生:
Response.End();
作为documented:
为了模仿 ASP 中 End 方法的行为,此方法尝试引发 [ThreadAbortException] 异常。如果此尝试成功,调用线程将被中止,这对您站点的性能不利。在这种情况下,调用 End 方法后不会执行任何代码。
所以你的Response.Clear
调用毫无意义——你应该期望看到ThreadAbortException
,在这种情况下你可以忽略它。
如果你需要打电话给Response.Clear
,应该在你写信之前给它打电话——但我怀疑你可以完全删除它。
【讨论】:
@user2740323:这并不意味着它是正确的......你应该始终确保你理解你正在使用的任何代码,并验证它是否有意义。 即使我删除了 respose.clear();和 response.end() 我知道这个错误:System.Web.dll 中发生了“System.Web.HttpUnhandledException”类型的第一次机会异常 @user2740323:我不建议你删除Response.End
,只删除Response.Clear
。 HttpUnhandledException
应该有一个内部异常 - 提高诊断技能非常重要,这样你就可以知道出了什么问题。确保您有适当的日志记录,以便您可以看到完整的堆栈跟踪。
我是 .net 新手,请告诉我如何执行日志记录
@user2740323:不——我建议你退后一步,从一本好书或教程中了解 ASP.NET。尝试在 Stack Overflow 评论线程中针对甚至与日志记录无关的问题这样做是不合适的。不过,您可能想看看 ELMAH:code.google.com/p/elmah【参考方案2】:
首先,我会使用像 EPPlus(GPL) 这样的 excel 库,我强烈推荐它。
那么创建真正的excel文件并将其写入Response
就这么简单,例如:
Dim pck = New ExcelPackage()
Dim ws = pck.Workbook.Worksheets.Add("Worksheet-Name")
ws.Cells("A1").LoadFromDataTable(dt, True, OfficeOpenXml.Table.TableStyles.Medium1)
Response.Clear()
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Response.AddHeader("content-disposition", "attachment; filename=ExcelFileName.xlsx")
Response.BinaryWrite(pck.GetAsByteArray())
这是另一个例子:http://epplus.codeplex.com/wikipage?title=WebapplicationExample
颠倒Response.Clear
+ Response.End
,Clear
应该是第一个,End
最后一个:
try
Response.Clear();
// ...
catch (Exception ex)
//log error
// use HttpContext.Current.ApplicationInstance.CompleteRequest(); instead
Response.End();
HttpResponse.End
将所有当前缓冲的输出发送到客户端,停止执行 页面,并引发 EndRequest 事件。
请注意,如果您尝试渲染 GridView
,还应使用覆盖 VerifyRenderingInServerForm
以避免异常。
public override void VerifyRenderingInServerForm(Control control)
/* Confirms that an HtmlForm control is rendered for the specified ASP.NET
server control at run time. */
GridView must be placed inside a form tag with runat="server" even after the GridView is within a form tag
编辑:
但是你可以用HttpContext.Current.ApplicationInstance.CompleteRequest();
代替Response.End
:
http://scottstoecker.wordpress.com/2012/01/12/fixing-threadabortexception-when-using-response-end/
【讨论】:
我尝试使用:HttpContext.Current.ApplicationInstance.CompleteRequest();现在我得到“在 System.Web.dll 中发生了“System.Web.HttpUnhandledException”类型的第一次机会异常” @user2740323:你是否也覆盖了VerifyRenderingInServerForm
?
是的,我也添加了 EnableEventValidation="false" 到页面指令@Tim Schmelter
我无法理解的是,相同的代码在其他 3 个页面中运行良好,但仅在此页面中显示错误。
@user2740323:您注意到ThreadAbortException
与HttpUnhandledException
是不同的例外吗?所以可能你已经解决了一个问题。你的HttpUnhandledException
提供更多信息吗?您是否使用调试器遍历每一行并检查所有相关变量(例如 gridview 的数据源)?你在哪一行得到了异常?以上是关于持续发生的 mscorlib.dll 中发生 System.Threading.ThreadAbortException的主要内容,如果未能解决你的问题,请参考以下文章
如何修复mscorlib.dll中发生的''System.AggregateException'“
在 WPF C# 中保存图像时出现错误 System.UnauthorizedAccessException 在 mscorlib.dll 中发生
“System.OutOfMemoryException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理
EF异常:“System.InvalidOperationException”类型的未经处理的异常在 mscorlib.dll 中发生
“System.IO.FileNotFoundException”类型的未经处理的异常在 mscorlib.dll 中发生
mscorlib.dll 中出现“System.ServiceModel.CommunicationException”类型的未处理异常