C# Timer 사용법 : 예제가 포함된 여러종류의 타이머

C# Timer(타이머)는 시간 기반의 이벤트를 처리하기 위한 중요한 도구입니다. 이를 사용하면 특정 시간 간격 또는 지정된 시간에 코드를 실행할 수 있습니다.
타이머는 주로 지정된 간격으로 코드 블록을 반복적으로 실행하는 방법을 나타냅니다. 예를 들어 10분마다 폴더를 백업하거나 매초마다 로그 파일에 쓰는 기능등이 있습니다.

소개

.NET에는 다음과 같은 Timer4 클래스가 포함되어 있으며, 각 클래스는 서로 다른 기능을 제공합니다.

  1. System.Timers.Timer : 정기적으로 이벤트를 발생합니다. 클래스는 다중 스레드 환경에서 서버 기반 또는 서비스 구성 요소로 사용하기 위한 것입니다. 사용자 인터페이스가 없으며 런타임에 표시되지 않습니다.
  2. System.Threading.Timer: 스레드 풀 스레드에서 정기적으로 단일 콜백 메서드를 실행합니다. 콜백 메서드는 타이머가 인스턴스화되어 변경할 수 없을 때 정의됩니다. 클래스와 System.Timers.Timer 마찬가지로 이 클래스는 다중 스레드 환경에서 서버 기반 또는 서비스 구성 요소로 사용하기 위한 것입니다. 사용자 인터페이스가 없고 런타임에 표시되지 않습니다.
  3. System.Windows.Forms.Timer: 이벤트를 정기적으로 발생시키는 Windows Forms 구성 요소입니다. 이 구성 요소에는 사용자 인터페이스가 없으며, 단일 스레드 환경에서 사용하도록 설계되었습니다.
  4. System.Windows.Threading.DispatcherTimer : DispatcherTimer는 Dispatcher 큐에서 통합 동작하는 타이머로, 지정된 시간 간격과 우선 순위에 의해 실행 순서가 결정된다. WPF에서만 쓰인다. 싱글 쓰레드 기반이고, WPF UI 쓰레드를 이용하기 때문에 UI 컨트롤에 자유롭게 접근할 수 있고 안전하다

System.Timers.Timer

가장 흔히 사용되는 타이머는 System.Timers.Timer 클래스입니다. 이 클래스는 주어진 시간 간격마다 이벤트를 발생시키는 기능을 제공합니다. 다음은 간단한 예제 코드입니다:
이 타이머는 멀티스레드에서 가장 안전한 타이머입니다. 그러므로 다중 스레드 환경에서 서버 기반 또는 서비스 구성 요소로 사용하기에 적합합니다.

using System;
using System.Timers;

class Program
{
    static void Main(string[] args)
    {
        // 타이머 생성
        Timer timer = new Timer(1000); // 1초 간격

        // 타이머 이벤트 핸들러 연결
        timer.Elapsed += TimerElapsed;

        // 타이머 시작
        timer.Start();

        Console.WriteLine("타이머 시작됨. 프로그램을 종료하려면 아무 키나 누르세요.");
        Console.ReadKey();

        // 타이머 중지
        timer.Stop();

        Console.WriteLine("프로그램 종료됨.");
    }

    static void TimerElapsed(object sender, ElapsedEventArgs e)
    {
        // 타이머 이벤트 발생 시 실행되는 메서드
        Console.WriteLine("타이머 이벤트 발생 시각: {0:HH:mm:ss.fff}", e.SignalTime);
    }
}

이 예제에서는 1초 간격으로 타이머 이벤트를 발생시키고, 이벤트 핸들러에서 현재 시간을 출력하고 있습니다. 프로그램을 실행하면 1초 간격으로 현재 시간이 출력되는 것을 확인할 수 있습니다.

속성을 사용하여 이벤트를 한 번만 발생하거나 반복적으로 발생하도록 개체를 AutoReset 구성할 수 있습니다 ‘timer.AutoReset = false’ 를 코드에 추가 하면 한번 동작하고 이벤트는 더이상 동작하지 않습니다.

System.Threading.Timer

C# 및 .NET 프레임워크에서 다중 스레드 환경에서 비동기 작업을 수행할 때 사용되는 타이머 클래스입니다. System.Threading.Timer 클래스를 사용하면 대리자를 지정된 시간 간격으로 계속 호출할 수 있습니다. 또한 이 클래스를 사용하여 지정된 시간 간격으로 대리자에 대한 단일 호출을 예약할 수 있습니다. 대리자는 ThreadPool 스레드에서 실행됩니다.

응용 프로그램에 UI가 없고 가능한 한 가장 가볍고 범용적으로 쓰이는 .Net 타이머를 원한다면 System.Threading.Timer 를 사용하는 것이 좋습니다.

System.Threading.Timer를 사용하려면 다음과 같이 작성할 수 있습니다:

using System;
using System.Threading;

namespace YourNamespace
{
    public class YourClass
    {
        private Timer timer;

        public YourClass()
        {
            // TimerCallback을 통해 실행할 메서드를 지정
            TimerCallback callback = new TimerCallback(TimerCallbackMethod);

            // Timer 인스턴스 생성
            // 첫 번째 매개변수: 타이머 콜백 메서드
            // 두 번째 매개변수: 콜백 메서드가 호출될 때까지의 지연 시간 (밀리초 단위)
            // 세 번째 매개변수: 타이머 주기 (밀리초 단위, Timeout.Infinite를 사용하면 한 번만 실행)
            timer = new Timer(callback, null, 0, 1000); // 1초마다 실행
        }

        private void TimerCallbackMethod(object state)
        {
            // 타이머가 실행될 때마다 호출되는 콜백 메서드
            // 여기에 원하는 작업을 구현할 수 있습니다.
        }
    }
}

위의 코드에서 TimerCallbackMethod 메서드는 타이머가 실행될 때마다 호출되는 콜백 메서드입니다. 여기에 원하는 작업을 구현할 수 있습니다.

System.Threading.Timer는 다중 스레드 환경에서 안전하게 사용할 수 있으며, 비동기 작업을 수행하는 데 유용합니다. 단일 또는 반복 작업을 예약할 수 있으며, 실행 주기와 지연을 설정하여 작업을 유연하게 조정할 수 있습니다.

System.Windows.Forms.Timer

“System.Windows.Forms.Timer”는 Windows Forms 애플리케이션에서 UI 업데이트 및 일정한 작업을 처리하는 데 사용되는 타이머 클래스입니다. 이 클래스를 사용하면 특정 시간 간격마다 이벤트를 발생시키고 해당 이벤트 핸들러를 실행할 수 있습니다.
주기적으로 윈폼 어플리케이션의 UI 를 변경해야 한다면 최적의 타이머입니다.
System.Windows.Forms.Timer를 사용하려면 다음과 같이 작성할 수 있습니다:

using System;
using System.Windows.Forms;

namespace YourNamespace
{
    public class YourForm : Form
    {
        private Timer timer;

        public YourForm()
        {
            // Timer 인스턴스 생성
            timer = new Timer();

            // 타이머 간격 설정 (밀리초 단위)
            timer.Interval = 1000; // 1초마다

            // 타이머 이벤트 핸들러 등록
            timer.Tick += Timer_Tick;

            // 타이머 시작
            timer.Start();
        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            // 타이머가 간격마다 실행할 작업 수행
            // 여기에 원하는 작업을 넣으면 됩니다.
        }
    }
}

위의 코드에서 Timer_Tick 메서드는 타이머가 실행될 때마다 호출되는 메서드입니다. 여기에 원하는 작업을 구현할 수 있습니다.

System.Windows.Forms.Timer는 Windows Forms 애플리케이션에서 UI 스레드에서 주기적인 작업을 수행하는 데 사용됩니다. 이는 UI 업데이트와 같은 작업을 처리하는 데 특히 유용하며, 간단하게 구현하여 사용할 수 있습니다.

System.Windows.Threading.DispatcherTimer

“System.Windows.Threading.DispatcherTimer”는 WPF(Windows Presentation Foundation) 애플리케이션에서 UI 업데이트 및 다른 작업을 처리하는 데 사용되는 타이머 클래스입니다. 이 클래스는 UI 스레드에서 동작하며 특히 UI 요소와 관련된 작업을 처리할 때 유용합니다.

Dispatcher는 WPF 애플리케이션에서 UI 스레드와의 통신을 관리하고 UI 업데이트를 처리하는 주 스레드 입니다. DispatcherTimer 란 말은 결국 UI 를 제어하는 Timer 가 됩니다.

System.Windows.Threading.DispatcherTimer를 사용하려면 다음과 같이 작성할 수 있습니다:

using System;
using System.Windows.Threading;

namespace YourNamespace
{
    public class YourClass
    {
        private DispatcherTimer timer;

        public YourClass()
        {
            // DispatcherTimer 인스턴스 생성
            timer = new DispatcherTimer();

            // 타이머 간격 설정 (TimeSpan 형식)
            timer.Interval = TimeSpan.FromSeconds(1); // 1초마다

            // 타이머 이벤트 핸들러 등록
            timer.Tick += Timer_Tick;

            // 타이머 시작
            timer.Start();
        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            // 타이머가 간격마다 실행할 작업 수행
            // 여기에 원하는 작업을 넣으면 됩니다.
        }
    }
}

위의 코드에서 Timer_Tick 메서드는 타이머가 실행될 때마다 호출되는 메서드입니다. 여기에 원하는 작업을 구현할 수 있습니다.

System.Windows.Threading.DispatcherTimer는 WPF 애플리케이션에서 UI 스레드에서 주기적인 작업을 수행하는 데 사용됩니다. UI 업데이트와 같은 작업을 처리하는 데 특히 유용하며, WPF의 특성에 맞게 디자인되어 있어 간단하게 구현하여 사용할 수 있습니다.

결론

이 문서에서는 C#에서 타이머를 사용하는 방법에 대해 설명했습니다. 또한 Timer 컨트롤을 사용하여 Windows 응용 프로그램을 만들고 이를 사용하여 특정 시간 간격으로 코드를 실행하는 방법도 살펴보았습니다.

Leave a Comment