Timer Class ใน C#
System.Timers.Timer สร้าง Event ทุกๆ ช่วงเวลาที่กำหนด (Interval) สามารถตั้งค่าให้ทำงานซ้ำ (Recurring) หรือครั้งเดียวได้
คุณสมบัติหลัก
| Property/Method |
คำอธิบาย |
Interval |
ช่วงเวลาระหว่าง Event (Milliseconds) |
AutoReset |
true = ทำงานซ้ำ, false = ทำงานครั้งเดียว |
Enabled |
true = เริ่มทำงาน, false = หยุด |
Start() / Stop() |
เริ่ม/หยุด Timer (เทียบเท่า Enabled) |
Elapsed Event |
Event ที่เกิดเมื่อครบ Interval |
โค้ดตัวอย่างพื้นฐาน
using System;
using System.Timers;
public class Demo {
private static Timer _timer;
public static void Main() {
// 1. สร้าง Timer (5 วินาที = 5000 ms)
_timer = new System.Timers.Timer(5000);
// 2. ผูก Event Handler
_timer.Elapsed += OnTimedEvent;
// 3. ตั้งค่า
_timer.AutoReset = true; // ทำงานซ้ำ
_timer.Enabled = true; // เริ่มทำงาน
Console.WriteLine("Timer started. Press Enter to exit...");
Console.ReadLine();
// Cleanup
_timer.Dispose();
}
private static void OnTimedEvent(Object source, ElapsedEventArgs e) {
Console.WriteLine("Raised: {0:HH:mm:ss.fff}", e.SignalTime);
}
}
ตัวอย่างขั้นสูง: Timer ที่หยุดเองหลัง N ครั้ง
using System;
using System.Timers;
public class AdvancedTimer {
private static Timer _timer;
private static int _count = 0;
private const int MaxCount = 5;
public static void Main() {
_timer = new Timer(1000); // 1 วินาที
_timer.Elapsed += OnTimedEvent;
_timer.AutoReset = true;
_timer.Enabled = true;
Console.WriteLine("Timer will run 5 times then stop...");
Console.ReadLine();
}
private static void OnTimedEvent(Object source, ElapsedEventArgs e) {
_count++;
Console.WriteLine($"[{_count}] {e.SignalTime:HH:mm:ss.fff}");
if (_count >= MaxCount) {
_timer.Stop();
_timer.Dispose();
Console.WriteLine("Timer stopped automatically.");
}
}
}
Timer ประเภทอื่นๆ ใน .NET
| Timer Class |
Namespace |
ใช้สำหรับ |
Thread Context |
| System.Timers.Timer |
System.Timers |
Server-side, Background Tasks |
Thread Pool Thread |
| System.Threading.Timer |
System.Threading |
Low-level, High Precision |
Thread Pool Thread |
| System.Windows.Forms.Timer |
System.Windows.Forms |
WinForms UI (Thread-Safe) |
UI Thread |
| System.Windows.Threading.DispatcherTimer |
System.Windows.Threading |
WPF UI (Thread-Safe) |
UI Thread |
System.Threading.Timer (Lightweight)
using System;
using System.Threading;
class Demo {
static Timer _timer;
static void Main() {
// Constructor: Callback, State, DueTime, Period
_timer = new Timer(Callback, null, 0, 2000); // เริ่มทันที ทุก 2 วินาที
Console.WriteLine("Press Enter to stop...");
Console.ReadLine();
_timer.Dispose(); // หยุดและปล่อยทรัพยากร
}
static void Callback(object state) {
Console.WriteLine($"Callback at {DateTime.Now:HH:mm:ss.fff}");
}
}
⚠️ ข้อควรระวัง
- Thread Safety: Elapsed Event รันบน Thread Pool - ต้อง Lock ถ้าเข้าถึง Shared Data
- Reentrancy: ถ้า Event ใช้เวลานานกว่า Interval อาจรันพร้อมกันได้ (AutoReset=true)
- Dispose: ต้อง Dispose() เสมอเพื่อหยุด Timer และปล่อยทรัพยากร
- GC: เก็บ Reference ไว้ (Field) ไม่งั้น Timer อาจถูก GC Collect
แนวทางแก้ปัญหา Reentrancy
private static readonly object _lock = new object();
private static void OnTimedEvent(Object source, ElapsedEventArgs e) {
if (!Monitor.TryEnter(_lock)) return; // Skip ถ้ายังทำงานอยู่
try {
// Long running work...
} finally {
Monitor.Exit(_lock);
}
}