首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# Timer 定時器使用範例:固定時間點觸發任務

     編輯:關於C語言

基本用法

System.Windows.Forms.Timer(UI 執行緒)或 System.Timers.Timer/System.Threading.Timer(背景執行緒)皆可實作定時任務。本文示範 WinForms Timer 每秒檢查是否到達指定時刻。

完整程式碼

using System;
using System.Collections;
using System.Windows.Forms;

public class TimerDemo : Form
{
    private Timer _timer;
    private readonly ArrayList _schedule = new ArrayList 
    { "08:30:00", "09:30:00", "10:30:00", "11:30:00" };

    public TimerDemo()
    {
        _timer = new Timer { Interval = 1000 }; // 1 秒
        _timer.Tick += Timer_Tick;
        _timer.Start();
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        string now = DateTime.Now.ToLongTimeString(); // 格式 HH:mm:ss
        foreach (string target in _schedule)
        {
            if (now == target)
            {
                MessageBox.Show($"現在時間是 {target},執行排程任務!");
                // 實際應用:呼叫服務、寫入日誌、發送通知等
            }
        }
    }

    [STAThread]
    static void Main() => Application.Run(new TimerDemo());
}

三種 Timer 比較

類別命名空間執行緒適用場景
System.Windows.Forms.TimerSystem.Windows.FormsUI 執行緒WinForms 簡單 UI 更新、頻率低(≥ 50ms)
System.Timers.TimerSystem.TimersThreadPoolServer 端定時任務、需精確間隔、支援 AutoReset
System.Threading.TimerSystem.ThreadingThreadPool高效能、輕量、無 UI 相依、適合背景服務

進階:精確到「特定日期時間」的一次性觸發

// 使用 System.Threading.Timer 計算首次延遲
DateTime target = new DateTime(2024, 12, 31, 23, 59, 0);
TimeSpan due = target - DateTime.Now;
if (due < TimeSpan.Zero) due = TimeSpan.Zero;

var timer = new System.Threading.Timer(_ =>
{
    Console.WriteLine("跨年倒數觸發!");
    // 執行一次性任務
}, null, due, Timeout.InfiniteTimeSpan); // 不重複

最佳實務建議

  • 避免在 Tick 事件執行耗時操作:UI Timer 會凍結介面,背景 Timer 會佔用 ThreadPool。耗時工作請 Task.Run 併發處理。
  • 防止重複觸發:若任務執行時間 > Interval,需加鎖或停用 Timer 再啟用。
  • 資源釋放:表單關閉或服務停止時呼叫 timer.Dispose() 或 timer.Change(Timeout.Infinite, ...)。
  • 排程框架替代:複雜排程(Cron 表達式、持久化、叢集)建議使用 Quartz.NET、Hangfire 或 FluentScheduler。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved