ASP를 활용한 간단한 이야기.NET 멀티스레드로 장시간 작업 수행

20064 단어
ASP에서.NET에서 장시간의 작업을 수행하려면 클라이언트에서 피드백을 통해 작업의 진행 상황을 파악해야 할 때가 있다. 대충 보면 다음과 같은 몇 가지 방법이 있다.
(1) 단추를 눌렀을 때
알림을 주고 작업을 수행하고 있음을 알립니다. 이
숨기기
(2) 버튼을 눌렀을 때 알림 작업이 실행 중인 페이지로 이동하고 실행이 끝난 후에 다시 이동한다
(3) 임무 클래스를 만들고 다른 라인을 열어 임무를 수행하는 동시에 클라이언트나 서버에 이 클래스의 실례를 저장하여 임무의 집행 상황을 추적한다(1)와(2)의 경우 많이 사용하고 간단하다. 단점은 임무의 집행 진도를 실시간으로 알 수 없고 시간이 지나면 시간이 초과될 수 있다는 것이다.(3) 방법은 위에서 말한 두 가지 결점을 비교적 잘 해결할 수 있다.다음은 (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 다중 스레드 예는 비교적 간단하고 기본적으로 장시간의 임무 수행과 클라이언트의 상호작용을 실현할 수 있지만 인터페이스가 우호적이지 않다. 만약에 여러 가지 조작이 있다면 얼마나 많은 시간을 수행했는지 제시할 수 있을 뿐 몇 번째 임무를 수행했는지 표시할 수 없다. 다음 글에서 이 종류와 인터페이스를 개선할 것이다)
이 지식은 매우 재미있고 많은 곳에서 사용되었다. 실현된 기본적인 사고방식은 차이가 많지 않고 단지 페이지의 변화를 나타낼 뿐이다.

좋은 웹페이지 즐겨찾기