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标头的错误,不知道该如何解决……
我是一个菜鸟,求高手拯救……
高手~~!!能给个简单点的例子不……看不懂啊这个
@沉默的第七天: 异步编程模型从来都不是简单的。基于你的需求,你应该使用 ajax 来实现导出功能,在页面实现部分刷新。
提供你一个思路,与这种异步HTTP原理差不多。
1、首先创建一个windows服务做业务处理(数据导出,报表打印),或则创建一个数据库任务,或则创建一个可执行文件,可以通过文件传输参数,也可以通过数据库。
2、如果Windows服务或数据库任务,可以通过监听文件以及数据库的变化来触发作业;如果是可执行文件,可以做成开机自启动,监听方式跟windows服务类似。
3、作业执行完毕,写作业执行情况到数据库中,提供数据或报表下载页面。
另外,提供实时启动可执行文件的一个思路,安全性不好。调用win32api的CreateProcessAsUser,在advapi32.dll中。
导出数据的功能放到另一个页面,当前页面用 window.open 打开。