熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

asp.net利用多線程執行長時間的任務,客戶端顯示出任務的執行進度的示例

2013-11-13 12:22:26  來源: .NET編程 

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

  運行這個頁面看到每秒頁面刷新一次反饋任務執行到現在的時間在結束後給出任務總的用時(如果任務出錯也給出出錯時間)

(這個示例比較簡單基本能實現長時間的任務執行與客戶端的交互但是界面不是很友善而且如果有很多項操作的話只能給出執行了多少時間不能顯示執行到第幾項任務在下一篇文章中將會改進這個類和界面)


From:http://tw.wingwit.com/Article/program/net/201311/15769.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.