본문 바로가기
프로그래밍/개발일지

c# Timer 3가지

by 개발하는군인 2023. 3. 23.

회사에서 특정 Action 발생 후 주기적으로 함수가 동작하는 업무를 맡았습니다. C#에서는 특정 작업을 주기적으로 실행하기 위해 흔히 Timer 객체를 사용하고  .NET 프레임워크에는 서로 다른  3가지의 Timer를 제공하고 있기에 해당 부분에 대해 정리합니다.

 

1.  C# 의 다양한  3가지 Timer 

    1). Sytem.WInodws.Forms.Timer

          사용자가 정의한 간격마다 이벤트를 발생시키며, Windows Forms 응용 프로그램에서 최적화

    2). Sytem.Threading.Timer

          지정된 간격으로 메서드를 실행하는 메커니즘 제공 

    3). Sytem.Timers.Timer

          응용 프로그램에 되풀이 이벤트 생성

 

3개다 Timer 의 사용법은 대동소이 한데 도우 응용프로그램 내에 사용할때에는 Forms.Timer 제외하면 UI Thread 에서 만들어진 컨트롤에 접근하려면 크로스 쓰레드 문제가 있으므로 먀샬링 된 호출 (invoke / BeginInvoke) 을 사용해야 합니다.

 

윈도우 응용프로그램을 예로들어 버튼이나 각종 컨트롤이 생성되고 핸들링 되는것은 UI Thraed 상에서 이루어집니다.

기본 Thread 이외에 개발자가 별도의 Thread를 생성하여 작업을 실행하면 이는 Worker Thread 라고 하고, UI Thread 입장에서는 .net 쓰레드 풀에 의해 실행되는 쓰레드도 Work Thread 라고 판단합니다.

 

정리하자면

- Main Ui thread에서만 컨트롤의 접근이 가능

-  사용자가 thread 객체를 만들거나 task thread를 가져다 써서 그안 UI 요소에 접근할 경우에는 InvalidOperationException (cross thread) 발생

-  Cross Thread를 방지하기 위해서는 Control의 invoke 또는 BeginInvoke를 통해 호출해야 합니다.

 

※ Ui thread 윈도우 메시지를 처리하기 위한 메시지 큐를 갖고 있는 Thread 이다.

 

 

2. 왜 그러면 UI 요소에 접근시 Forms.Timer는 문제가 없는가 ?   

같은 UI Thread 내에서 동작하는것을 보장한다. 그러면 안전하겠다라고 생각 할 수 있지만  UI Thread에서 sleep 할  경우 해당 timer도 동작을 멈춘다.  반대로 말하면  timer에서  너무 무거운 작업을 한다면 UI Thread 도 Freeze가 된다는 말이다.

해당 코드를 시작해보면 프로그램이 Freeze 하는걸 알 수 있다.

 

해당 코드를 시작하면 프로그램이 Freeze 되지 않고 동작하는 걸 확인할수 있다.

 

3. 그럼  어떤 상황에 어떤 Timer를 써야하는가 ?

 

UI 프로그램에서  컨트롤의 속성들을 직접 마샬링 없이 엑세스 하고, 핸들러 자체가 무거운 작업을 하지 않을때는  WINFORM : System.Windows.Threading.DispatcherTimer , WPF : System.Windows.Threading.DispatcherTimer   

 

UI Thread  와는 별도로 독립적으로 돌아가는 작업이 필요한 경우, 상대적으로 무거운 작업을 할때는System.Threading.Timer,  System.Timers.Timer