2008-09-29 6 views
5

타임 아웃과 같은 X 초 후에 발생해야하는 비 반복 이벤트가 있다고 가정합니다. 직관적으로 System.Timers.Timer를 작성하고 간격을 X * 1000으로 설정하고 해당 틱을 이벤트에 연결하여 시작하십시오. 이 이벤트는 비 반복 이벤트이므로 타이머를 한 번 올린 후에는 타이머를 멈추어야합니다..NET 타이머 : X 초 동안 알림을받는 가장 좋은 방법은 무엇입니까?

실제로 타이머가 본질적으로 되풀이된다는 사실은 실제로 이것이 최선의 방법 일 경우 나를 믿을 수 없게 만듭니다. 시간을 절약하기 위해 더 좋고/더 정확하고 안전할까요? 매초마다 (또는 밀리 초 단위로) 타이머를 설정하고 진드기로 시간을 시스템에 폴링하고 필요한 시간이 경과하면 수동으로 대상 이벤트를 발생 시키십니까?

두 방법 중 가장 좋은 방법이있는 경우 누구든지 체중을 측정 할 수 있습니까? (다른 옵션도 있습니다). 기다려야하는 시간 간격이 밀리 초 단위로 측정되는 경우 한 가지 방법이 다른 방법보다 향상됩니까?

답변

10

constructor은 System.Threading.Timer에 대해 기간을으로 지정할 수 있습니다. 이 매개 변수를 -1로 설정하면 주기적 시그널링이 비활성화되고 한 번만 실행됩니다.

+0

!!! 거룩한 쓰레기 벤, 절대 알았어, 당신은 당신이 암기하거나 뭐든지의 모든 것을 가지고 –

+0

그 중 하나를 몰랐다. 나는 항상 Qt의 QTimer :: singleshot을 더 쉽게 발견했지만 BCL 타이머가 이것을 할 수 있다는 것을 알고있다. – OregonGhost

+0

예, 나는 침대 앞에 매일 밤 그것을 읽었다 :-) –

5

정상적인 타이머를 사용하고 한 번 경과 한 후에는 비활성화하십시오. 문제를 해결해야하는

둘 다 system.threading.timer 및 system.timers.timer가이를 지원합니다.

+0

나는 이미이 옵션을 궁리했지만 신뢰도에 대해 궁금해하고있다. –

2

새로운 BackgroundWorker를 종료하고 잠자기, 종료합니다.

var worker = new BackgroundWorker(); 
worker.DoWork += delegate { 
    Thread.Sleep(30000); 
    DoStuff(); 
} 
worker.RunWorkerAsync(); 
+0

은 흥미로운 해결책이다. –

+0

이것은 30000 ms 동안 프로세서를 차지하지 않을까? –

+0

@Nency - 아니요. 그렇게 생각하지 않습니다. 백그라운드 스레드는 잠 들어 있어야하며 CPU 시간을 사용하지 않아야합니다. – RickL

0

다만,이 X의 초 후에 진드기 및 진드기의 코드에서 설정이 수행

timer.enabled = 거짓;

나를 위해 일했습니다.

0

정확한 시간 측정을 원할 경우 타이머 빈도를 두 배로 늘리고 DateTime.Now를 사용하여 시작 시간과 비교하십시오. Timers와 Thread.Sleep은 시간 측정에서 반드시 정확하지는 않습니다.

1

타이머를 한 번 실행하려면 System.Timers.Timer를 AutoReset = true로 설정하거나 System.Threading.Timer를 무한 기간 (System.Threading.Timeout.Infinite = -1)으로 사용하면됩니다.

어느 경우 든 되풀이 간격이없는 경우 Timer.Timer의 이벤트 처리기 또는 Threading.Timer의 콜백에서 완료 한 후에 타이머를 삭제해야합니다.