读书人

ASP.NET 怎么异步导出数据

发布时间: 2013-08-21 10:42:06 作者: rapoo

ASP.NET 如何异步导出数据?
我在网页上做了一个导出的功能,但是在导出数据量比较大的时候页面的其它功能会比较卡……

    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.NET callback
[解决办法]
多线程吧。。。每个下载开个新线程。
[解决办法]
如果叫你同时处理大量数据你也会卡的,电脑和人脑一样啊
[解决办法]
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将数据异步发送到后台进行导出处理,这样当前页面就不会卡的,你仍然可以在当前页面操作其它元素
[解决办法]
多线程,防止页面假死
[解决办法]
那就专门做一个ashx处理程序来导出数据(通常ajax请求),和页面本身的处理分离开
[解决办法]
每次取100条 分批写入
[解决办法]
http://www.cnblogs.com/chanedi/articles/2151591.html
例子中是用ajax下载文件,原理是一样的,只不过httpreponseHeader不一样
[解决办法]
你这个不就是异步委托么?异步委托完成方法前后,只能通过AJAX轮询去获取是否完成的状态。
[解决办法]
我觉得吧,最简单的就是新打开一个页面专门去做数据导出这件事,这样原来的网页操作什么都不会有影响
[解决办法]
网页,还搞什么多线程,只能优化代码了,尽量减少无谓的判断。
[解决办法]
这代码不是给B/S结构来用的。
[解决办法]
没听说什么叫“异步导出数据”?!

既然你都是页面一次性下载数据,这就跟asp.net异步多线程编程扯不到一起去。asp.net异步多线程编程,是指暂时不下载数据,而丝毫并不会加快下载数据的速度。
[解决办法]
引用:
我觉得吧,最简单的就是新打开一个页面专门去做数据导出这件事,这样原来的网页操作什么都不会有影响



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

不过就算是多个页面分别打开不同数据页,也无法合并下载数据,给用户增加了麻烦。
[解决办法]

引用:
这代码不是给B/S结构来用的。


同意!

asp.net程序员请不要讨论这类问题,这完全跟asp.net知识不搭界。请学习c/s开发知识,程序员才能开发各种实用的上传下载商用小程序。
[解决办法]
简单的可以ajax轮询
[解决办法]
给你两个解决办法:1,把输出缓存关闭。写完一批数据后执行一下Respose.flush
2,非要用多线程,那就把你的线程用来生成静态文件吧。把数据写到文件时。然后让用户在XX秒后访问这个文件
[解决办法]
解决方案:
1.点击导出按钮时,后台线程进行生成数据,存为文件
2.数据生成完成后,后台通知前台页面,并生成下载链接
3.用户再去点击下载链接,进行下载

读书人网 >asp.net

热点推荐