Timer
< 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)