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

 

前台

 

<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;
   }
  }
 }
}

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

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



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=342078

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

http://blog.csdn.net/LoveCherry/archive/2005/04/10/342078.aspx

asp.net利用多线程执行长时间任务客户端显示出任务执行进度示例(改代码,晚上结帐)

05-29

原文章:http://www.cnblogs.com/lovecherry/archive/2005/04/10/135090.htmlrnrn我参照这篇文章在做一个长时间任务的页面,我想对 dowork() 类斌值,但是一直出错。这行rn System.Threading.Thread thread=new System.Threading.Thread(new System.Threading.ThreadStart(dowork)); 这里的System.Threading.ThreadStart 只能是方法,所以dowork不能带参数,而我又想在dowork里取到aspx里TextBox1文本框的值。rnrnrn问题:在dowork类里,如果取到TextBox1文本框的值rnrn[code=HTML]<%@ Page language="c#" Codebehind="WebForm54.aspx.cs" AutoEventWireup="false" Inherits="csdn.WebForm54" %> rn rn rn rn WebForm54 rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn[/code]rn[code=C#]using System; rnusing System.Collections; rnusing System.ComponentModel; rnusing System.Data; rnusing System.Data.SqlClient; rnusing System.Drawing; rnusing System.Web; rnusing System.Web.SessionState; rnusing System.Web.UI; rnusing System.Web.UI.WebControls; rnusing System.Web.UI.HtmlControls; rnrnnamespace csdn rn rn /// rn /// WebForm54 的摘要说明。 rn /// rn public class WebForm54 : System.Web.UI.Page rn rn protected System.Web.UI.HtmlControls.HtmlGenericControl div_load; rn protected System.Web.UI.WebControls.Button btn_startwork; rn protected System.Web.UI.WebControls.Label lab_state; rn protected System.Web.UI.WebControls.Label lab_jg; rn protected work w; rnrn private void Page_Load(object sender, System.EventArgs e) rn rn // 在此处放置用户代码以初始化页面 rn if(Session["work"]==null) rn rn w=new work(); rn Session["work"]=w; rn rn else rn rn w=(work)Session["work"]; rn rn switch(w.State) rn rn case 0: rn rn this.div_load.Visible=false; rn break; rn rn case 1: rn rn this.lab_state.Text=""+((TimeSpan)(DateTime.Now-w.StartTime)).TotalSeconds.ToString("0.00")+" 秒过去了,完成百分比:"+w.Percent+" %"; rn this.btn_startwork.Enabled=false; rn Page.RegisterStartupScript(""," "); rn this.lab_jg.Text=""; rn break; rn rn case 2: rn rn this.lab_jg.Text="任务结束,并且成功执行所有操作,用时 "+((TimeSpan)(w.FinishTime-w.StartTime)).TotalSeconds+" 秒"; rn this.btn_startwork.Enabled=true; rn this.div_load.Visible=false; rn break; rn rn case 3: rn rn this.lab_jg.Text="任务结束,在"+((TimeSpan)(w.ErrorTime-w.StartTime)).TotalSeconds+"秒的时候发生错误导致任务失败'"; rn this.btn_startwork.Enabled=true; rn this.div_load.Visible=false; rn break; rn rn rn rnrn #region Web 窗体设计器生成的代码 rn override protected void OnInit(EventArgs e) rn rn // rn // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 rn // rn InitializeComponent(); rn base.OnInit(e); rn rn rn /// rn /// 设计器支持所需的方法 - 不要使用代码编辑器修改 rn /// 此方法的内容。 rn /// rn private void InitializeComponent() rn rn this.btn_startwork.Click += new System.EventHandler(this.btn_startwork_Click); rn this.Load += new System.EventHandler(this.Page_Load); rnrn rn #endregion rnrn private void btn_startwork_Click(object sender, System.EventArgs e) rn rn if(w.State!=1) rn rn this.btn_startwork.Enabled=false; rn this.div_load.Visible=true; rn w.runwork(); rn Page.RegisterStartupScript(""," "); rn rn rn rn rnrn public class work rn rn public int State=0;//0-没有开始,1-正在运行,2-成功结束,3-失败结束 rn public int Percent=0;//完成百分比 rn public DateTime StartTime; rn public DateTime FinishTime; rn public DateTime ErrorTime; rnrn public void runwork() rn rn lock(this) rn rn if(State!=1) rn rn State=1; rn StartTime=DateTime.Now; rn System.Threading.Thread thread=new System.Threading.Thread(new System.Threading.ThreadStart(dowork)); rn thread.Start(); rn rn rn rnrn private void dowork() rn rn try rn rn SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]); rn SqlCommand cmd=new SqlCommand("Insert Into test (test)values('“ + TextBox.txt + ”')",conn); //<----我的问题是要在这里取到aspx的数据,比如取到aspx一个TextBox的数据rn conn.Open(); rn for(int p=0;p<100;p++) rn rn for(int i=0;i<10;i++) rn rn cmd.ExecuteNonQuery(); rn Percent=p;//这里就是定义百分比,你估计这个操作费多少时间定义多少百分比 rn rn conn.Close(); rn //以上代码执行一个比较消耗时间的数据库操作 rn State=2; rn rn catch rn rn ErrorTime=DateTime.Now; rn Percent=0; rn State=3; rn rn finally rn rn FinishTime=DateTime.Now; rn Percent=0; rn rn rn rn rnrn[/code]rnrnrn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试