2012-06-19 2 views
0

C# 타이머를 사용하여 5 초 간격으로 메서드를 실행하려고합니다. 이 코드는 작동하지 않습니다. 나는 그것을 실행할 때 오류가 발생하지 않지만 프로그램 (콘솔에서 실행)은 IP.timer1.Start() 바로 종료됩니다. timer1_Elapsed 메소드가 절대 실행되지 않습니다. 나는 프로그램이 timer1_Elapsed 메소드의 첫 번째 라인에서 콘솔에 문자열을 출력하도록 시도했기 때문에 그 사실을 알고있다.C# timers.timer가 제대로 작동하지 않습니다.

class Program 
{ 
    Timer timer1 = new Timer(); 

    static void Main(string[] args) 
    { 
     Program IP = new Program(); 
     IP.timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed); 
     IP.timer1.Interval = 5000; 
     IP.timer1.Enabled = true; 
     IP.timer1.Start(); 

    } 

    static void timer1_Elapsed(object sender, ElapsedEventArgs e) 
    { 
    //Function to get executed each time the counter elapses. 
    } 

} 

답변

3

이유는 타이머의 Start 방법은 다른 스레드에서 타이머를 시작하고, 즉시 메서드에서 반환하는 것입니다. 이로 인해 Main 메서드가 끝나고 콘솔이 종료됩니다.

Timer (사용중인 BCL에 비슷한 이름의 클래스가 몇 개 있음)에 따라 다르게 적용하려고 할 수 있습니다. 사용중인 기술에 따라 System.Timers.Timer, System.Windows.Forms.Timer 또는 System.Threading.Timer에 대한 설명서를 읽는 것이 좋습니다.

+0

감사합니다. 나는 system.timers.timer를 사용하고있다. 이 픽스를 구현하는 방법에 대한 예제를 알려 주시면 정말 감사하겠습니다. 나중에 Windows 서비스로 내 소프트웨어를 실행할 예정이므로 앞으로 "console.read()"를 사용할 수 없기 때문에 – jimutt

+0

@ user1308385 Windows 서비스로 실행하면 콘솔 응용 프로그램과 같은 방식으로 코드가 종료되지 않으므로이 문제가 발생하지 않습니다. 테스트를 위해 console.readline을 넣고 [msdn] (http://msdn.microsoft.com/en-us/library/zt39148a(v=vs.80).aspx). –

1

타이머가 다른 스레드에서 시작됩니다. 타이머 시작 후 사용자가 키를 누를 때까지 스레드를 일시 중단하려면 다음을 사용하십시오.

Console.ReadLine(); 
2

주 기능이 종료되는 순간 프로그램이 종료됩니다.

Console.ReadLine()을 사용하여 준비가 끝날 때까지 main이 종료되지 않도록해야합니다.

0

IP.timer1.Start() 직후에 프로그램이 종료되는 이유는 Main() - 함수 실행이 끝났기 때문에 반환하지 못하도록하는 것이 아닙니다.

프로그램을 계속 실행하려면 Console.ReadKey()를 추가하십시오. after timer1.Start(); 따라서 응용 프로그램은 해당 함수가 반환 될 때까지 기다립니다 (키를 누를 때). 이 작업을 수행 한 후 5 초마다 콜백을 호출해야합니다.

관련 문제