首页 新闻 搜索 专区 学院

ASP.NET中如何异步导出数据?

0
悬赏园豆:100 [已解决问题] 解决于 2013-08-20 08:59
  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);
        System.Web.HttpContext httpcontext = new HttpContext(context.Request,context.Response);
        try
        {
            httpcontext.Response.AppendHeader("Content-Disposition", string.Format("attachment; filename=" + System.Web.HttpUtility.UrlPathEncode("工单导出列表") + ".xls"));
            httpcontext.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标头的错误,不知道该如何解决……

我是一个菜鸟,求高手拯救……

沉默的第七天的主页 沉默的第七天 | 初学一级 | 园豆:112
提问于:2013-08-16 14:22
< >
分享
最佳答案
0
收获园豆:50
Launcher | 高人七级 |园豆:45045 | 2013-08-16 14:35

高手~~!!能给个简单点的例子不……看不懂啊这个

沉默的第七天 | 园豆:112 (初学一级) | 2013-08-16 14:42

@沉默的第七天: 异步编程模型从来都不是简单的。基于你的需求,你应该使用 ajax 来实现导出功能,在页面实现部分刷新。

Launcher | 园豆:45045 (高人七级) | 2013-08-16 15:03
其他回答(2)
0

提供你一个思路,与这种异步HTTP原理差不多。

1、首先创建一个windows服务做业务处理(数据导出,报表打印),或则创建一个数据库任务,或则创建一个可执行文件,可以通过文件传输参数,也可以通过数据库。

2、如果Windows服务或数据库任务,可以通过监听文件以及数据库的变化来触发作业;如果是可执行文件,可以做成开机自启动,监听方式跟windows服务类似。

3、作业执行完毕,写作业执行情况到数据库中,提供数据或报表下载页面。

另外,提供实时启动可执行文件的一个思路,安全性不好。调用win32api的CreateProcessAsUser,在advapi32.dll中。

收获园豆:25
kylin.chen | 园豆:983 (小虾三级) | 2013-08-16 15:36
0

导出数据的功能放到另一个页面,当前页面用 window.open 打开。

收获园豆:15
geass.. | 园豆:1819 (小虾三级) | 2013-08-18 06:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册