2013-08-31 4 views
0

나는 프로그래밍에 익숙하지 않으므로 모든 도움이 필요합니다. 내 CreateTable을 매 2 초마다 실행하려고하는데, 버튼을 클릭하여 InitLoop을 실행하면 아무 일도 일어나지 않습니다. , 나는 여러 가지 일을 시도했지만 성공적으로이 일을 할 수 없었습니다.시간을 기준으로 실행되는 무한 루프

private void CreateTable() 
    {    
     //Set the number of columns and rows 
     int tblColumns = 20; 
     int tblRows = 50; 
     //Create the table 
     Table tbl = new Table(); 

     tbl.CssClass = "table"; 
     //Add table 
     PlaceHolder1.Controls.Add(tbl); 
     Random RandomNumber = new Random(); 
     for (int i = 0; i < tblRows; i++) 
     { 
      TableRow tr = new TableRow(); 
      for (int j = 0; j < tblColumns; j++) 
      { 
       TableCell tc = new TableCell(); 
       int Range = RandomNumber.Next(1, 99); 
       tc.Text = Range.ToString(); 
       //Add Columns 
       tr.Cells.Add(tc); 
      } 
      //Add Rows 
      tbl.Rows.Add(tr); 
     } 
     return; 
    } 

    System.Timers.Timer myTimer = new System.Timers.Timer(); 

    private void InitLoop(bool runLoop) 
    { 
     while (true) 
     { 
      try 
      { 
       myTimer.Elapsed += myTimer_Elapsed; 
       myTimer.Interval = 2000; 
       myTimer.Enabled = true; 
       myTimer.Start(); 
      } 
      catch (Exception f) 
      { 
       //handle the exception 
      } 
     } 
    } 

    private void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     CreateTable(); 
    } 
+0

중단 점을 설정하고 코드를 한 줄씩 단계별로 시도해 보셨습니까? –

+0

그래, 내가 디버깅을 잘 못해서 무엇을하고 있는지, 나는 답변 중 하나에 지정된 코드를 변경했다. 그러나 디버그 할 때 CreateTable이 3 번 발생한다고 생각한다. 문제의, 나는 심지어 이것도 새로운 테이블을 만들 자리 표시자를 사용하는 경우에도 최선의 옵션이기 때문에, 나는 어떤 제안에 열려 있는지 잘 모르겠다. 감사합니다 –

답변

1

타이머 만 있으면됩니다. 무한 루프가 타이머를 빠르게 재설정하므로 아무 일도 일어나지 않습니다. 그것은 또한 가능한 한 빨리 루프를 실행하려고 100 %로 CPU를 구동하기 때문에

private void InitLoop(bool runLoop) 
{ 
    try 
    { 
     myTimer.Elapsed += myTimer_Elapsed; 
     myTimer.Interval = 2000; 
     myTimer.Enabled = true; 
     myTimer.Start(); 
    } 
    catch (Exception f) 
    { 
     //handle the exception 
    } 
} 

는 일반적으로 당신은, Thread.sleep를() 명령의 일종없이 무한 루프를 원하지 않는다.

+0

나는 내 단추를 클릭 할 때 여전히 내 테이블을 표시하지 않지만이 코드를 사용하여 시도 했습니까? System.Threading.Thread.Sleep (5000)을 추가하면 테이블을 표시 할 수 있습니다. "시도"하지만 여전히 내 테이블을 자동으로 새로 고치지 않습니다. –

+0

그냥 다시 확인했는데, 어떤 이유로 시작을 누르면 테이블에 생성됩니다. 그 이유가 무엇인지 알지 못한다면 그 이유를 이해할 수 없습니다. –

+0

좋아요, 그래서 버튼을 누르면 실행되는 InitLoop가 실행되고 다시 컨트롤이 페이지로 전달됩니다. 따라서 스레드가 끝나기 전에 타이머가 시작되면 데이터가 클라이언트로 전송됩니다. thread.sleep도없고 타이머가 작동 할 시간도 없습니다. Thread.sleep (5000)은 타이머의 두 번 실행을 의미하므로 두 번째 테이블을 추가하기 전에 자리 표시 자에서 첫 번째 테이블을 삭제하지 않으므로 두 개의 테이블이 삭제됩니다. createtable 메소드를 반복적으로 시작하려면 클라이언트 측에 javascript 타이머를 넣어야 할 수도 있습니다. – Lathejockey81

0

콜백이 발생하지만 대부분 CreateTable 메서드는 예외를 throw합니다. 예외의 이유는 메서드가 GUI 개체를 변경하려고하기 때문입니다. 이러한 객체를 변경하려면 gui 스레드에 있어야합니다. 조회해야 할 것은 Dispatcher이며 콜백을 전달하는 방법입니다.

타이머 콜백 메서드에 try-catch를 추가하고 디버그하여 확인하거나 로그 파일 또는 이와 유사한 예외를 작성하십시오.

+0

나는 타이머 콜백 메소드에 try-catch를 추가하고 디버깅했지만 아무 것도 잡히지 않습니다. CreateTable에 중단 점을 추가하면 즉시 호출됩니다. 타이머를 무시하니? –