我在网页上做了一个导出的功能,但是在导出数据量比较大的时候页面的其它功能会比较卡……
    protected void btnExport_Click(object sender, EventArgs e)
    {
               AsyncExportData Export = new AsyncExportData(this.ExportDataAsync);
        AsyncCallback CallBack = new AsyncCallback(ExportCallBack);
        HttpContext context=this.Context;
        IAsyncResult IAResult = Export.BeginInvoke(context, CallBack, Export);
    }
    //异步导出
    public delegate HSSFWorkbook AsyncExportData(HttpContext context);
    public HSSFWorkbook ExportDataAsync(HttpContext context)
    {
        #region
         //导出方法
        #endregion
       
        //写入到客户端        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        book.Write(ms);
        try
        {
            context.Response.AppendHeader("Content-Disposition", string.Format("attachment; filename=" + System.Web.HttpUtility.UrlPathEncode("工单导出列表") + ".xls"));
            context.Response.BinaryWrite(ms.ToArray());
        }
        catch
        {
            
        }
        book = null;
        ms.Close();
        ms.Dispose();
        return book;
        #endregion
    }
    private void ExportCallBack(IAsyncResult Result)
    {
        AsyncExportData Exoprt = (AsyncExportData)Result.AsyncState;
        HSSFWorkbook book = Exoprt.EndInvoke(Result);     }新线程里的Response.AppendHeader会报无法追加HTTP标头的错误,不知道该如何解决……ASP.NETcallback

解决方案 »

  1.   

    protected void btnExport_Click(object sender, EventArgs e)
        {
                   AsyncExportData Export = new AsyncExportData(this.ExportDataAsync);
            AsyncCallback CallBack = new AsyncCallback(ExportCallBack);
            HttpContext context=this.Context;
            IAsyncResult IAResult = Export.BeginInvoke(context, CallBack, Export);
        }// 你这段代码是由服务器控件触发的吧,这个我感觉不像异步
    // 个人觉得应该在前台用javascript将数据异步发送到后台进行导出处理,这样当前页面就不会卡的,你仍然可以在当前页面操作其它元素
      

  2.   

    那就专门做一个ashx处理程序来导出数据(通常ajax请求),和页面本身的处理分离开
      

  3.   

    http://www.cnblogs.com/chanedi/articles/2151591.html
    例子中是用ajax下载文件,原理是一样的,只不过httpreponseHeader不一样
      

  4.   

    你这个不就是异步委托么?异步委托完成方法前后,只能通过AJAX轮询去获取是否完成的状态。
      

  5.   

    哦~~~~!俺赶紧学习一下!看不明白……忽然想起来AJAX什么的完全没接触过啊……俺入行才不到两个月啊……
      

  6.   

    没听说什么叫“异步导出数据”?!既然你都是页面一次性下载数据,这就跟asp.net异步多线程编程扯不到一起去。asp.net异步多线程编程,是指暂时不下载数据,而丝毫并不会加快下载数据的速度。
      

  7.   


    我觉得这是前24个回帖中最“有意义的”回答了。当然打开一个页面并不会增加导出数据的任何速度,但是总比“多线程”的说法要靠谱了,因为这注意到了是html页面“从submit到再次下载html内容”之间的机制的问题造成的。不过就算是多个页面分别打开不同数据页,也无法合并下载数据,给用户增加了麻烦。
      

  8.   


    同意!asp.net程序员请不要讨论这类问题,这完全跟asp.net知识不搭界。请学习c/s开发知识,程序员才能开发各种实用的上传下载商用小程序。
      

  9.   


    同意!asp.net程序员请不要讨论这类问题,这完全跟asp.net知识不搭界。请学习c/s开发知识,程序员才能开发各种实用的上传下载商用小程序。还是不导出数据的时候会卡很久么……俺就是想能不能不让它卡的……
      

  10.   

    给你两个解决办法:1,把输出缓存关闭。写完一批数据后执行一下Respose.flush
    2,非要用多线程,那就把你的线程用来生成静态文件吧。把数据写到文件时。然后让用户在XX秒后访问这个文件
      

  11.   

    我获取数据的方法是从数据库里获得一个datatable,这部分比较慢,但是我改不了……
      

  12.   

    新手就是悲剧啊,看啥啥不懂,学校里教的就和ABCD差不多……