分享
 
 
 

(原创)asp.net利用多线程执行长时间的任务,客户端显示出任务的执行进度的示例(一)

王朝asp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

在asp.net中执行一个长时间的操作,有的时候需要在在客户端有一个反馈能了解到任务的执行进度,大致看了一下有这么几种做法:

(1)按下按钮的时候给出一个<div>提示正在执行任务,执行完毕让这个<div>隐藏

(2)按下按钮的时候跳转到一个提示任务正在执行的页面,执行完毕了再跳转回来

(3)做一个任务类,开启另外一个线程执行任务,同时在客户端或者服务器端保存这个类的实例来跟踪任务的执行情况

(1)和(2)的情况用的比较多,也比较简单,缺点是不能实时的知道任务的执行进度,而且时间一长可能会超时,(3)的方法就会比较好的解决上面说的2个缺点。下面着重说一下(3)的实现方法,先从简单开始,我们做一个任务类,在客户端时时(暂且刷新时间为1秒)得知任务执行了多少时间,并且在成功完成任务后给出执行时间,在任务出错的时候给出出错的时间。

前台

<form id="Form1" 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 System.Web.UI.WebControls.Button btn_startwork;

protected System.Web.UI.WebControls.Label lab_state;

//前面2个是vs.net自己生成的

protected work w;

在Page_Load里面输入以下代码:

if(Session["work"]==null)

{

w=new work();

Session["work"]=w;

}

else

{

w=(work)Session["work"];

}

switch(w.State)

{

case 0:

{

this.lab_state.Text="还没有开始任务";

break;

}

case 1:

{

this.lab_state.Text="任务进行了"+((TimeSpan)(DateTime.Now-w.StartTime)).TotalSeconds+"秒";

this.btn_startwork.Enabled=false;

Page.RegisterStartupScript("","<script>window.setTimeout('location.href=location.href',1000);</script>");

//不断的刷新本页面,随时更新任务的状态

break;

}

case 2:

{

this.lab_state.Text="任务结束,并且成功执行所有操作,用时"+((TimeSpan)(w.FinishTime-w.StartTime)).TotalSeconds+"秒";

this.btn_startwork.Enabled=true;

break;

}

case 3:

{

this.lab_state.Text="任务结束,在"+((TimeSpan)(w.ErrorTime-w.StartTime)).TotalSeconds+"秒的时候发生错误导致任务失败";

this.btn_startwork.Enabled=true;

break;

}

}

在按钮单击事件内输入以下代码:

if(w.State!=1)

{

this.btn_startwork.Enabled=false;

w.runwork();

Page.RegisterStartupScript("","<script>location.href=location.href;</script>");

//立即刷新页面

}

另外建立一个任务类,代码如下:

public class work

{

public int State=0;//0-没有开始,1-正在运行,2-成功结束,3-失败结束

public DateTime StartTime;

public DateTime FinishTime;

public DateTime ErrorTime;

public void runwork()

{

lock(this)//确保临界区被一个Thread所占用

{

if(State!=1)

{

State=1;

StartTime=DateTime.Now;

System.Threading.Thread thread=new System.Threading.Thread(new System.Threading.ThreadStart(dowork));

thread.Start();

}

}

}

private void dowork()

{

try

{

SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);

SqlCommand cmd=new SqlCommand("Insert Into test (test)values('test')",conn);

conn.Open();

for(int i=0;i<5000;i++)cmd.ExecuteNonQuery();

conn.Close();

//以上代码执行一个比较消耗时间的数据库操作

State=2;

}

catch

{

ErrorTime=DateTime.Now;

State=3;

}

finally

{

FinishTime=DateTime.Now;

}

}

}

}

运行这个页面,看到每秒页面刷新一次反馈任务执行到现在的时间,在结束后给出任务总的用时。(如果任务出错也给出出错时间)

(这个示例比较简单,基本能实现长时间的任务执行与客户端的交互,但是界面不是很友善,而且如果有很多项操作的话,只能给出执行了多少时间,不能显示执行到第几项任务,在下一篇文章中,将会改进这个类和界面)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有