C#

Timer

윤태영(Coding) 2023. 6. 16. 03:27

< Timer란 ? >

Timer는 일정한 시간 간격으로 코드를 실행할 때 사용된다. 예를 들어, 주기적으로 데이터를 새로고침하거나, 시간을 표시하는 데 사용할 수 있다.

C#에는 크게 세 가지 타입의 Timer가 있다.

  • System.Windows.Forms.Timer
  • System.Timers.Timer
  • System.Threading.Timer

 


[System.Windows.Forms.Timer]

이 Timer는 UI 스레드에서 동작한다. 따라서, UI 요소를 갱신하는데 유용하다. 하지만 오래 걸리는 작업을 처리하면 UI가 멈출 수 있다.

[매 초마다 현재 시간을 화면에 표시하는 코드]

using System;
using System.Timers;

class Program
{
    static void Main()
    {
        System.Timers.Timer myTimer = new System.Timers.Timer(2000); // 2초 간격으로 설정
        myTimer.Elapsed += OnTimedEvent; // 이벤트 핸들러 연결
        myTimer.Start(); // 타이머 시작

        Console.WriteLine("Press Enter to exit...");
        Console.ReadLine();
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
    }
}

위 코드는 2초마다 콘솔에 현재 시간을 출력한다. Elapsed 이벤트에 메소드를 연결하여 타이머가 경과할 때마다 실행된다.


[System.Threading.Timer]

이 Timer는 스레드 풀의 스레드에서 작업을 수행한다. 주로 백그라운드 작업에 적합하다.

using System;
using System.Threading;

class Program
{
    static int count = 0;

    static void Main()
    {
        TimerCallback callback = new TimerCallback(PrintMessage);
        Timer stateTimer = new Timer(callback, null, 0, 2000); // 2초 간격으로 설정

        Console.WriteLine("Press Enter to exit...");
        Console.ReadLine();
    }

    static void PrintMessage(object state)
    {
        count++; // 카운터 증가
        Console.WriteLine($"안녕하세요. {count}번째 윤태영입니다.");
    }
}

위 코드도 2초마다 메시지를 출력한다. 하지만 이 타이머는 스레드 풀의 스레드를 사용한다.

 

※ System.Threading.Timer와 System.Timers.Timer

둘 다 주기적으로 코드를 실행하는데 사용된다. 하지만 둘 사이에는 차이점이 있다.

무거운 작업이거나 높은 정밀도(빠른 간격의 정확한 타이밍)가 필요하면 System.Threading.Timer를 사용이 권장된다.
이벤트 기반으로 작업하거나 UI와 상호작용이 필요하다면 System.Timers.Timer이 권장된다.


[System.Windows.Forms.Timer] 

WinForms 애플리케이션에서 사용되는 Timer. UI 스레드에서 실행된다.

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WinFormsApp4
{
    public partial class Form1 : Form
    {
        private System.Windows.Forms.Timer timer1;
        private int counter = 0;
        private Label greetingLabel;
        private Color[] colors = { Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Blue, Color.Indigo, Color.Violet };
        
        public Form1()
        {
            InitializeComponent();

            timer1 = new System.Windows.Forms.Timer();
            timer1.Tick += TimerEventProcessor;
            timer1.Interval = 2000; // 2초
            timer1.Start();
        }

        private void TimerEventProcessor(object sender, EventArgs e)
        {
            counter++;
            this.Text = "Counter: " + counter.ToString();

            //배경색 변경
            this.BackColor = colors[counter % colors.Length];
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            
            // 라벨을 생성하고 "안녕하세요!" 출력하기.
            greetingLabel = new Label();
            greetingLabel.Text = "안녕하세요!";
            greetingLabel.Location = new Point(350, 200); // 라벨의 위치 설정
            greetingLabel.AutoSize = true;

            // 라벨을 폼에 추가.
            this.Controls.Add(greetingLabel);
        }
    }
}
namespace WinFormsApp4
{
    partial class Form1
    {
        private System.ComponentModel.IContainer components = null;

        // 폼이 종료될 때 리소스를 정리하는 메서드
        // disposing 매개변수가 true이면 관리되는 리소스를 해제
        protected override void Dispose(bool disposing)
        {
            // disposing이 true이고, components가 null이 아니라면
            // components를 해제하여 메모리를 정리
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code


        private void InitializeComponent()
        {
            SuspendLayout();

            // Form1 설정
            // AutoScaleDimensions -> 폼의 크기를 조절하는데 사용되는 설정값
            AutoScaleDimensions = new SizeF(7F, 15F);
            //  폰트 크기에 맞춰 조절.
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(800, 450);
            Name = "Form1";
            Text = "Form1";
            // 폼이 로드될 때 실행할 이벤트 핸들러를 설정
            Load += new System.EventHandler(this.Form1_Load);

            ResumeLayout(false);
        }

        #endregion
    }
}

2초마다 폼의 배경색을 변경할 수 있도록 해보았다.

 

 

Reference : C#.NET 0.5년차~3년차(파트1)

https://www.inflearn.com/course/lecture?courseSlug=%EB%8B%B7%EB%84%B7-%EC%9C%88%ED%8F%BC-1&unitId=77894&tab=curriculum 

 

학습 페이지

 

www.inflearn.com