Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

Timer ใน C# - ตั้งเวลาทำงานอัตโนมัติ

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);
    }
}