programing

콘솔 응용 프로그램의 안정적인 타이머

oldcodes 2023. 5. 29. 11:09
반응형

콘솔 응용 프로그램의 안정적인 타이머

.NET에는 세 가지 타이머 유형이 있습니다(.NET Framework 클래스 라이브러리의 타이머 클래스 비교 참조).메인 스레드가 사용 중일 경우 다른 유형이 표류할 수 있기 때문에 스레드 타이머를 선택했는데, 신뢰할 수 있도록 해야 합니다.

타이머 제어에서 이 타이머가 작동하는 방식은 다른 스레드에 배치되어 사용량이 많지 않을 때 부모 스레드에서 완료된 작업 시작과 함께 항상 체크 표시될 수 있습니다.

콘솔 응용 프로그램에서 이 타이머의 문제는 타이머가 다른 스레드를 따라 똑딱거리는 동안 주 스레드가 응용 프로그램을 닫을 때 아무 작업도 하지 않는다는 것입니다.

추가를 시도했습니다.while true루프, 하지만 타이머가 꺼지면 메인 스레드가 너무 바빠집니다.

다음과 같은 것을 사용할 수 있습니다.Console.ReadLine()다른 백그라운드 스레드(예: 타이머 스레드)가 계속 작동하도록 주 스레드를 차단합니다.또한 AutoResetEvent를 사용하여 실행을 차단한 다음(필요할 때) 해당 AutoResetEvent 개체에서 Set() 메서드를 호출하여 메인 스레드를 해제할 수 있습니다.또한 Timer 개체에 대한 참조가 범위를 벗어나 가비지 수집되지 않도록 합니다.

수동 재설정 이벤트를 사용하여 처리가 끝나면 주 스레드를 차단하고 호출합니다.Reset()타이머 처리가 완료되면 표시됩니다.이 작업을 계속 실행해야 하는 경우 콘솔 앱 대신 서비스 프로세스로 이동하는 것을 고려하십시오.

MSDN과 다른 답변에 따르면, 시스템을 사용하는 콘솔 응용프로그램의 최소한의 작동 예입니다.스레드화.즉시 종료하지 않는 타이머:

private static void Main()
{
    using AutoResetEvent autoResetEvent = new AutoResetEvent(false);
    using Timer timer = new Timer(state => Console.WriteLine("One second has passed"), autoResetEvent, TimeSpan.Zero, new TimeSpan(0, 0, 1));
    autoResetEvent.WaitOne();
}

언급URL : https://stackoverflow.com/questions/39/reliable-timer-in-a-console-application

반응형