728x90
C# 에서 Timer는 특정 작업을 주기적으로 실행하기 위해 사용합니다.
이 Timer에는 3가지 종류의 타이머가 있습니다.
각각의 Timer에 대해 알아보겠습니다.
1. System.Windows.Forms.Timer
메인스레드에서 동작하는 Timer입니다. 간단한 작업 그리고 UI 작업이 필요한 경우에 적합하며 Timer가 긴 작업을 할 경우 버튼클릭을 요청해도 먹히지 않는 현상이 발생할 수 있다고 합니다. 일반적으로 도구상자에 있는 Timer가 이에 해당됩니다.
예제)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
//주기적으로 실행할 코드
//메인스레드에서 동작 -> 크로스 스레드 발생X
//간단한 내용
label1.Text = "라벨";
}
}
}
2. System.Timers.Timer
이벤트 방식으로 함수가 호출됩니다. 메인스레드와 별개의 스레드에서 작업합니다. 1번 스레드와 달리 오래걸리는 작업에 적합합니다.
예제)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;
namespace WindowsFormsApp6
{
public partial class Form1 : Form
{
private System.Timers.Timer timer;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
timer = new System.Timers.Timer(3000); //3초 마다 실행
timer.Elapsed += OnTimer;
timer.Enabled = true;
timer.AutoReset = true;//true는 반복실행, false는 한번만 실행
}
private void OnTimer(object sender, ElapsedEventArgs e)
{
//별개 스레드에서 동작하기 때문에 크로스 스레드 발생
//오래걸리는 작업에 유리
this.BeginInvoke(new Action(() =>
{
label1.Text = "System.Timers.Timer 실행";
}));
//디버그로 실행시키지 않는다면 예외 오류가 나타나지 않음
int a = 0;
int divide = 1 / a;
throw new Exception("예외 일부러 발생");
}
}
}
3. System.Threading.Timer
스레드풀에서 콜백 메서드를 실행합니다.
2번 Timer와 마찬가지로 메인스레드와 별개의 스레드에서 작업하며 오래걸리는 작업에 적합합니다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;
namespace WindowsFormsApp6
{
public partial class Form1 : Form
{
private System.Timers.Timer timer;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
int a = 5;
System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(timerWork), a, 1000, 3000); //처음 시작은 1초 이후 반복은 3초마다
}
//콜백함수
private void timerWork(object state)
{
//a값을 얻을 수 있다.
int result = (int)state;
MessageBox.Show(result + "");
//예외 오류가 발생함
//int a = 0;
//int divide = 1 / a;
}
}
}
'C# Programming > C#' 카테고리의 다른 글
[C#] 저장 프로시저 호출 (0) | 2024.05.15 |
---|---|
[C#] 디버깅 하는방법 (0) | 2024.05.15 |
[C#] 이벤트 게시 및 수신 (0) | 2024.05.15 |
[C#] 비동기 프로그래밍 (0) | 2024.05.15 |
[C#] 멀티스레드 (0) | 2024.05.14 |