做一個任務類,在用戶端時時(暫且重新整理時間為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;
}
}
}
}
運行這個頁面,看到每秒頁面重新整理一次反饋任務執行到現在的時間,在結束後給出任務總的用時。(如果任務出錯也給出出錯時間)