2008-08-01 8 views
75

.NET에는 세 가지 타이머 유형이 있습니다 (Comparing the Timer Classes in the .NET Framework Class Library 참조). 주 스레드가 사용중인 경우 다른 유형의 표류가 발생할 수 있으므로 스레드 타이머를 선택했으며 신뢰할 수 있어야합니다.콘솔 응용 프로그램의 신뢰할 수있는 타이머

타이머 제어에서이 타이머가 작동하는 방식이 다른 스레드에 넣어 지므로 작업량이 많지 않을 때 상위 스레드에서 완료된 작업 시작과 함께 항상 체크 할 수 있습니다.

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

while true 루프를 추가하려고 시도했지만 타이머가 작동하지 않을 때 주 스레드가 너무 바쁩니다.

답변

48

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

15

ManualResetEvent을 사용하여 처리가 끝날 때 주 스레드를 차단하고 타이머 처리가 완료되면 Reset()을 호출하는 것이 좋습니다. 이것이 지속적으로 실행되어야하는 것이라면 콘솔 앱 대신 서비스 프로세스로 이동하는 것을 고려하십시오.