系统.Threading.ThreadAbortException发生在mscorlib.dll中持续发生

时间:2013-10-02 07:13:30

标签: c# asp.net

我是.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小时,没有任何工作。

然后我尝试选择调试 - &gt; 例外菜单项,在显示的对话框中,选中“公共语言运行时例外”的第一个复选框,

我收到此错误:

  

拒绝访问路径'C:\ Users \ abcd \ AppData \ Local \ Temp \ Temporary ASP.NET Files \ mark \ 3f229106 \ f785abea \ App_Web_0h5ppn4m.dll'。

2 个答案:

答案 0 :(得分:5)

是的,它会因此而发生:

Response.End();

作为documented

  

为了模仿ASP中End方法的行为,此方法尝试引发[ThreadAbortException]异常。如果此尝试成功,则调用线程将被中止,这对您站点的性能不利。在这种情况下,执行End方法调用后没有代码。

因此,您的Response.Clear来电毫无意义 - 您应该期待看到ThreadAbortException,在这种情况下您可以忽略这一点。

如果你需要在所有上致电Response.Clear ,那应该在你写信之前 - 但我怀疑你可以完全删除它。

答案 1 :(得分:0)

首先,我会使用像EPPlus(GPL)这样的excel-ibrary,我可以热烈推荐。

然后创建真实的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.EndClear应该是第一个,而End应该是最后一个:

try {
    Response.Clear();
    // ...
} catch (Exception ex) {
    //log error
}
// use HttpContext.Current.ApplicationInstance.CompleteRequest(); instead  
Response.End();  

HttpResponse.End

  

将所有当前缓冲的输出发送到客户端,停止执行   页面,并引发EndRequest事件。

请注意,如果您尝试渲染VerifyRenderingInServerForm,也应该使用覆盖GridView来避免异常。

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


修改

但您可以使用Response.End代替HttpContext.Current.ApplicationInstance.CompleteRequest();

http://scottstoecker.wordpress.com/2012/01/12/fixing-threadabortexception-when-using-response-end/