浅谈利用ASP.NET多线程执行长时间的任务

开发 后端
本文将浅谈如何利用ASP.NET多线程执行长时间的任务,客户端显示出任务的执行进度的示例。希望本文能对大家有所帮助。

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

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

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

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

ASP.NET多线程前台

  1. <form id="Form1" method="post" runat="server">   
  2. <asp:label id="lab_state" runat="server"></asp:label><br>   
  3. <asp:Button id="btn_startwork" runat="server" Text="运行一个长时间的任务"></asp:Button>   
  4. </form>  

ASP.NET多线程后台

先是一些类的申明:

  1. protected System.Web.UI.WebControls.Button btn_startwork;   
  2. protected System.Web.UI.WebControls.Label lab_state;   
  3. //前面2个是vs.net自己生成的   
  4. protected work w;   
  5. 在Page_Load里面输入以下代码:   
  6. if(Session["work"]==null)   
  7.    {   
  8.     w=new work();   
  9.     Session["work"]=w;   
  10.    }   
  11.    else   
  12.    {   
  13.     w=(work)Session["work"];   
  14.    }   
  15.    switch(w.State)   
  16.    {   
  17.     case 0:   
  18.     {   
  19.      this.lab_state.Text="还没有开始任务";   
  20.      break;   
  21.     }   
  22.     case 1:   
  23.     {   
  24.      this.lab_state.Text="任务进行了"+((TimeSpan)(DateTime.Now-w.StartTime)).TotalSeconds+"秒";   
  25.      this.btn_startwork.Enabled=false;   
  26.      Page.RegisterStartupScript("","<script>window.setTimeout(’locationlocation.href=location.href’,1000);</script>");   
  27.      //不断的刷新本页面,随时更新任务的状态   
  28.      break;   
  29.     }   
  30.     case 2:   
  31.     {   
  32.      this.lab_state.Text="任务结束,并且成功执行所有操作,用时"+((TimeSpan)(w.FinishTime-w.StartTime)).TotalSeconds+"秒";   
  33.      this.btn_startwork.Enabled=true;   
  34.      break;   
  35.     }   
  36.     case 3:   
  37.     {   
  38.      this.lab_state.Text="任务结束,在"+((TimeSpan)(w.ErrorTime-w.StartTime)).TotalSeconds+"秒的时候发生错误导致任务失败";   
  39.      this.btn_startwork.Enabled=true;   
  40.      break;   
  41.     }   
  42.    }  

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

  1. if(w.State!=1)   
  2.    {   
  3.     this.btn_startwork.Enabled=false;   
  4.     w.runwork();   
  5.     Page.RegisterStartupScript("","<script>locationlocation.href=location.href;</script>");   
  6.     //立即刷新页面   
  7.    }  

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

  1. public class work   
  2.  {   
  3.   public int State=0;//0-没有开始,1-正在运行,2-成功结束,3-失败结束   
  4.         public DateTime StartTime;   
  5.   public DateTime FinishTime;   
  6.   public DateTime ErrorTime;   
  7.   public void runwork()   
  8.   {   
  9.    lock(this)//确保临界区被一个Thread所占用   
  10.    {   
  11.     if(State!=1)   
  12.     {   
  13.      State=1;   
  14.      StartTime=DateTime.Now;   
  15.      System.Threading.Thread thread=new System.Threading.Thread(new System.Threading.ThreadStart(dowork));   
  16.      thread.Start();                            
  17.     }   
  18.    }   
  19.   }   
  20.   private void dowork()   
  21.   {   
  22.    try   
  23.    {   
  24.     SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);   
  25.     SqlCommand cmd=new SqlCommand("Insert Into test (test)values(’test’)",conn);   
  26.     conn.Open();   
  27.     for(int i=0;i<5000;i++)cmd.ExecuteNonQuery();   
  28.     conn.Close();   
  29.     //以上代码执行一个比较消耗时间的数据库操作   
  30.     State=2;   
  31.    }   
  32.    catch   
  33.    {   
  34.     ErrorTime=DateTime.Now;   
  35.     State=3;   
  36.    }   
  37.    finally   
  38.    {   
  39.     FinishTime=DateTime.Now;   
  40.    }   
  41.   }   
  42.  }   
  43. }  

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

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

【编辑推荐】

  1. ASP.NET的DataList和Repeater控件
  2. 浅析ASP.NET的IIS映射
  3. 概述ASP.NET状态类型
  4. 浅谈ASP.NET和Web服务器
  5. ASP.NET的EnableViewState属性
责任编辑:彭凡 来源: newasp.net
相关推荐

2009-07-21 17:09:47

ASP.NET多线程

2009-07-22 16:11:43

ASP.NET AJA

2009-07-20 15:30:11

ASP.NET应用

2009-07-24 10:52:42

ASP.NET ISA

2009-07-28 18:00:11

ASP.NET程序

2009-07-27 13:01:28

TreeViewASP.NET

2009-07-21 14:16:02

ASP.NET管道优化

2009-07-23 15:24:37

ASP.NET Ima

2011-08-23 10:58:59

2009-07-27 16:19:59

ASP.NET报表控件

2009-08-05 15:29:33

ASP.NET For

2009-07-28 17:49:30

ASP.NET定期回收

2009-07-28 16:03:23

ASP.NET状态服务

2009-07-23 15:44:39

ASP.NET MVC

2009-07-20 17:12:17

ASP.NET访问数据

2009-07-22 13:24:24

ASP.NET MVC

2009-08-10 10:19:47

ASP.NET组件设计

2011-01-26 11:09:07

2009-07-21 09:53:55

ASP.NET AJAWCF服务

2009-07-27 09:14:06

ASP.NET Jav
点赞
收藏

51CTO技术栈公众号