닷넷에서 Timer를 사용하는 경우 새로운 스레드를 만들어서 처리 되는 것이므로 메인 스레드와의 동기화에 조심해야 됩니다. 그래서 Timer에서는 메인 폼의 컨트롤을 직접 조작이 불가능합니다.

그러나 DispatcherTimer를 사용하면 작업의 처리가 메인 스레드의 Dispatch에서 처리 되므로 메인 스레드와 동기화가 됩니다.

시간이 아주 정확하게 실행되어야 되는 경우가 아니라면 이것을 사용하는 것이 좋을 것 같습니다.

이것을 사용하려면 직접 참조에 WindwosBase를 추가해야 됩니다.




출처 : MSDN

Dispatcher 루프의 맨 위에서 DispatcherTimer가 다시 평가됩니다.

시간 간격이 발생할 때 정확하게 타이머가 실행될지 보장할 수 없지만 시간 간격이 발생하기 전에 타이머가 실행되지 않는 것은 보장할 수 있습니다. 이는 DispatcherTimer 작업이 다른 작업처럼 Dispatcher 큐에 있기 때문입니다. DispatcherTimer 작업 실행 시기는 큐의 다른 작업 및 해당 우선 순위에 따라 다릅니다.

System.Timers..::.Timer가 WPF 응용 프로그램에서 사용되는 경우 System.Timers..::.Timer는 UI(사용자 인터페이스) 스레드가 아닌 다른 스레드에서 실행됩니다. UI(사용자 인터페이스) 스레드의 개체에 액세스하려면 InvokeBeginInvoke를 사용하여 UI(사용자 인터페이스) 스레드의 Dispatcher로 작업을 게시해야 합니다. System.Timers..::.Timer를 사용하는 예제를 보려면 시스템 타이머를 통한 명령 소스 비활성화 샘플을 참조하십시오. System.Timers..::.Timer 대신 DispatcherTimer를 사용하는 이유는 DispatcherTimerDispatcher와 같은 스레드에서 실행되며 DispatcherTimer에서 DispatcherPriority를 설정할 수 있기 때문입니다.

개체의 메서드가 타이머에 바인딩될 때마다 DispatcherTimer는 개체를 유지합니다.


신고
by 흥배 2009.03.21 12:06
| 1 |