在aspnet中执行一个长时间的操作有的时候需要在在客户端有一个反馈能了解到任务的执行进度大致看了一下有这么几种做法
()按下按钮的时候给出一个<div>提示正在执行任务执行完毕让这个<div>隐藏
()按下按钮的时候跳转到一个提示任务正在执行的页面执行完毕了再跳转回来
()做一个任务类开启另外一个线程执行任务同时在客户端或者服务器端保存这个类的实例来跟蹤任务的执行情况
()和()的情况用的比较多也比较简单缺点是不能实时的知道任务的执行进度而且时间一长可能会超时()的方法就会比较好的解决上面说的个缺点下面着重说一下()的实现方法先从简单开始我们做一个任务类在客户端时时(暂且刷新时间为秒)得知任务执行了多少时间并且在成功完成任务后给出执行时间在任务出错的时候给出出错的时间
前台
<form id=Form method=post runat=server>
<asp:label id=lab_state runat=server></asp:label><br>
<asp:Button id=btn_startwork runat=server Text=运行一个长时间的任务></asp:Button>
</form>
后台
先是一些类的申明
protected SystemWebUIWebControlsButton btn_startwork;
protected SystemWebUIWebControlsLabel lab_state;
//前面个是vsnet自己生成的
protected work w;
在Page_Load里面输入以下代码:
if(Session[work]==null)
{
w=new work();
Session[work]=w;
}
else
{
w=(work)Session[work];
}
switch(wState)
{
case :
{
thislab_stateText=还没有开始任务;
break;
}
case :
{
thislab_stateText=任务进行了+((TimeSpan)(DateTimeNowwStartTime))TotalSeconds+秒;
thisbtn_startworkEnabled=false;
PageRegisterStartupScript(<script>windowsetTimeout(locationhref=locationhref);</script>);
//不断的刷新本页面随时更新任务的状态
break;
}
case :
{
thislab_stateText=任务结束并且成功执行所有操作用时+((TimeSpan)(wFinishTimewStartTime))TotalSeconds+秒;
thisbtn_startworkEnabled=true;
break;
}
case :
{
thislab_stateText=任务结束在+((TimeSpan)(wErrorTimewStartTime))TotalSeconds+秒的时候发生错误导致任务失败;
thisbtn_startworkEnabled=true;
break;
}
}
在按钮单击事件内输入以下代码
if(wState!=)
{
thisbtn_startworkEnabled=false;
wrunwork();
PageRegisterStartupScript(<script>locationhref=locationhref;</script>);
//立即刷新页面
}
另外建立一个任务类代码如下
public class work
{
public int State=;//没有开始正在运行成功结束失败结束
public DateTime StartTime;
public DateTime FinishTime;
public DateTime ErrorTime;
public void runwork()
{
lock(this)//确保临界区被一个Thread所占用
{
if(State!=)
{
State=;
StartTime=DateTimeNow;
SystemThreadingThread thread=new SystemThreadingThread(new SystemThreadingThreadStart(dowork));
threadStart();
}
}
}
private void dowork()
{
try
{
SqlConnection conn=new SqlConnection(SystemConfigurationConfigurationSettingsAppSettings[conn]);
SqlCommand cmd=new SqlCommand(Insert Into test (test)values(test)conn);
connOpen();
for(int i=;i<;i++)cmdExecuteNonQuery();
connClose();
//以上代码执行一个比较消耗时间的数据库操作
State=;
}
catch
{
ErrorTime=DateTimeNow;
State=;
}
finally
{
FinishTime=DateTimeNow;
}
}
}
}
运行这个页面看到每秒页面刷新一次反馈任务执行到现在的时间在结束后给出任务总的用时(如果任务出错也给出出错时间)
(这个示例比较简单基本能实现长时间的任务执行与客户端的交互但是界面不是很友善而且如果有很多项操作的话只能给出执行了多少时间不能显示执行到第几项任务在下一篇文章中将会改进这个类和界面)