Timer와 DispatcherTimer 비교


98

차이가 무엇인가 between System.Windows.Forms.Timer()와는 System.Windows.Threading.DispatcherTimer()? 어떤 경우에 사용해야합니까? 모범 사례가 있습니까?

답변:


111

Windows.Forms.TimerWindows Forms 메시지 루프를 사용하여 타이머 이벤트를 처리합니다. Windows Forms 응용 프로그램에서 사용되는 타이밍 이벤트를 작성할 때 사용해야하며 기본 UI 스레드에서 타이머를 실행하려고합니다.

DispatcherTimerWPF 타이밍 메커니즘입니다. 유사한 방식으로 타이밍을 처리하고 싶을 때 (단일 스레드로 제한되지는 않지만-각 스레드에는 자체 디스패처가 있음) WPF를 사용하는 경우에 사용해야합니다. Dispatcher와 동일한 스레드에서 이벤트를 발생시킵니다.

일반적으로, WPF == DispatcherTimer그리고 Windows Forms == Forms.Timer.

즉 , 별도의 스레드에서 실행 System.Threading.Timer되는 타이머 class인도 있습니다. 이것은 UI 업데이트를 시도하지 않는 순전히 수치 타이밍에 좋습니다.


1
빠른 응답에 감사합니다. 즉, UI와 관련된 타이머를 원할 때마다 DispatcherTimer를 사용해야하며 UL을 고정하고 싶지 않은 타이머를 실행하려면 System.Threading.Timer를 별도의 실. 두 번째 질문은 DispatcherTimer를 사용하고 UI에 바인딩되지 않은 타이머를 원하는 경우 System.Threading.Timer를 사용하여 분리 된 스레드에서 호출해야합니까 아니면 여전히 DisptacherTimer를 사용해야합니까?
paradisonoir

3
그것은 당신이하려는 일에 달려 있습니다. 나는 System.Threading.Timer를 거의 사용하지 않습니다-보통 Dispatcher Timer를 고수 한 다음 BackgroundWorker와 같은 것을 사용하여 다른 스레드에서 WORK (UI를 차단할 수있는 것)를 수행합니다. 이벤트 핸들러에서 "너무 많은"작업을하지 않는 한 타이머는 UI를 차단해서는 안됩니다.
Reed Copsey

시간이 지남에 따라 DispatcherTimer가 프로세서를 소모하는 데 문제가 있습니다. 그것을 처리하는 좋은 방법이 있습니까?
discorax

구체적으로 CPU를 먹는 것이 무엇인지 확인하십시오. 중지되지 않는 타이머를 많이 만들고 있습니까?
Reed Copsey

3
간격 속성을 올바르게 설정했는지 확인하십시오. 이렇게하지 마십시오 : timer1.Interval = new TimeSpan (1000); // "1000"은 밀리 초가 아닌 틱을 나타냅니다! CPU는 다음과 같이 수정할 때까지 매우 높았습니다. timer1.Interval = System.TimeSpan.FromSeconds (1);
Lonnie Best

4

여기에 작은 예제가있는 타이머에 대한 좋은 기사를 찾았습니다. http://www.progware.org/Blog/post/Timers-in-WPF.aspx

결론적으로 :

DoSomething ()이 GUI 구성 요소를 조작하는 경우 Timer를 사용하여 다음을 사용해야합니다. this.Dispatcher.Invoke ((Action) delegate {// GUI RELATED CODE HERE} 다른 스레드에서 직접 GUI 컨트롤에 액세스 할 수 없기 때문입니다. DispatcherTimer를 사용하면 수행 할 수 있습니다. 그렇게 할 필요가 없습니다.

DoSomething ()이 시간이 많이 걸리는 작업을 수행하면 DispatcherTimer의 경우 GUI가 중지됩니다. Timer의 경우 긴 메 토스가 다른 스레드에서 실행되기 때문에 그렇지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.