2009-11-30 3 views
0

다음 타이머는 얼마나 오래 실행됩니까? 프로그램을 닫을 때까지 계속 실행될 것입니다. 그러나 10 라운드의 틱을 ​​가졌 으면 타이머가 닫힙니다.C# 타이머 - 종료

static void Main() 
     { 
      Console.WriteLine("Started at {0:HH:mm:ss:fff}", DateTime.Now); 
      using (System.Threading.Timer timer = 
      new System.Threading.Timer(new TimerCallback(Tick), null, 3000, 1000)) 
      { 

       // Wait for 10 seconds 
       Thread.Sleep(10000); 

       // Then go slow for another 10 seconds 
       timer.Change(0, 2000); 
       Thread.Sleep(10000); 
      } 


      Console.ReadKey(true); 
     } 
     static void Tick(object state) 
     { 
      Console.WriteLine("Ticked at {0:HH:mm:ss.fff}", DateTime.Now); 
     } 
+0

프로그램의 타이머 요구 사항을 알려주시겠습니까? (예 : 프로그램 사용 기간 동안 3 초마다 코드 실행) 또한,이게 정말 콘솔 앱이 될 것입니까, 아니면 WinForm입니까? –

답변

3

문제는 프로그램이 Using-Block을 종료하는 순간 타이머가 파괴된다는 것입니다. Console.ReadKey(True)을 위로 사용 문으로 밀어 넣으면 작동합니다. 이 프로그램의 메인 스레드를 차단 이후

static void Main() 
    { 
     Console.WriteLine("Started at {0:HH:mm:ss:fff}", DateTime.Now); 
     using (System.Threading.Timer timer = 
     new System.Threading.Timer(new TimerCallback(Tick), null, 3000, 1000)) 
     { 

      // Wait for 10 seconds 
      Thread.Sleep(10000); 

      // Then go slow for another 10 seconds 
      timer.Change(0, 2000); 
      // unnecessary: Thread.Sleep(10000); 

      Console.ReadKey(true); 
     } 
    } 
    static void Tick(object state) 
    { 
     Console.WriteLine("Ticked at {0:HH:mm:ss.fff}", DateTime.Now); 
    } 

또한 Threading.Sleep()는 이러한 상황을 처리하는 best way 아니다.

+1

당신은 납을 묻었습니다. 먼저 OP의 질문에 대답하기 위해 답을 구조 조정하는 것이 좋습니다. 그리고 나머지는 비판합니다. –

+0

@ 제프 : 네가 맞아 ... 나는 그것을 분명하게하기 위해 그것을 다시 썼다. 고마워, +1. – Bobby