采用Ajax,或者在你的Label外面加一个UpdatePanel进行异步加载
ajax异步,使用一个timer
大概思路与伪代码:
=========================
页面A: 1 :先新建一个线程,来做以下事情——
int count = 所有待运行的项目数;
Session["总数"] = count;
for (int i=0;i<count;i++)
{
//DoSomething;
Session["当前序数"] = i;
}
2 : 当前线程输出已设计好的一段HTML,它包含一个计时器,一段获得页面B数据的ajax代码与和以此为基础定时重绘的进度条。
=========================
页面B:Json或xml格式,写入Session["总数"],Session["当前序数"]
写的不好,大概是这个意思。
通过ajax的异步加载应该能够实现。
原则上来说Asp.NET程序是不能做到这样子输出的,或者说B/S程序都无法做到这一点吧。就按照你的来说,在一个for循环中,i增加一次页面就要显示一次,这可以说即使你做winform程序,也基本是需要借助其他方式来实现的。这里就会存在一个线程阻塞问题,程序运行到i标量增加后就需要挂起当前线程,然后输出结果到客户端,客户端响应后再继续循环,这是你想要的结果,问题是web程序是单线程的,所以当变量增加时挂起当前线程,输出也就挂起了。
所以要实现这个功能的话,建议两种方式,客户端使用javascript来模拟一下这个过程,做一个假性的显示告诉用户当前进度,然后再做一个ajax取服务器端操作状态,如果服务器端操作完成了,javascript模拟也可以结束了。
其次使用ajax来请求,服务器端变量增加一次,你可以记录一个标示到某个文件中,然后ajax进行快速刷新时去读取该文件标示,从而显示结果到客户端。不过这样子读出来的结果也应该是很快的,如果你测试的话,可以在服务器端加个Sleep线挂起当前线程一段时间,然后可以看到这样子的效果。
不是不可以,不过做成你这种效果,估计会对服务器造成很大的压力。
首先进行一次查询:利用ajax获取待显示的记录数,例如获取到的记录数为100,也可能为99...
然后,进行100次循环,每次循环采取ajax读取一条记录(查询条件和获取显示记录数一样,不同的是,分页条件不一样,你需要将当前的页数传到后台),然后利用js将获取到的数据append到你的网页中去。
值得注意的是:如果用一般的循环,可能会遇到意想不到的结果。我们知道ajax是异步的,那么,第一次循环后,并不会等待第一次查询结束以后在进行第二次循环,也许在一秒之内js就进行了100次的循环。然而由于网络传输的问题,也许第3条数据会比第二条数据先传回到客户端。
就是说,如果想保证第三条数据显示在第二条数据之后,就必须在第二条数据成功获取并加载到网页中后,才去进行下一次循环。可以采取如下的方式:
function getData(currentIndex){
jQuery.ajax({
...
success: function(msg){
//这里将msg内容append到网页中去
//下面进行下一次提取数据
i++;
getData(i);
}
});
}
这里只是给一个思路,具体的内容就由你自己去完成吧