在 C# 中實現「定時、按時」執行,主要有三大路徑:進程內 Timer、Windows 排程任務、Windows Service。選型取決於應用類型(WinForms/WPF/ASP.NET)、部署環境(虛擬主機/獨立伺服器)與可靠度需求。
適用於應用程式持續執行的場景(WinForms、WPF、Console、Windows Service)。
using System.Timers;
Timer timer = new Timer(3600000); // 1 小時(毫秒)
timer.Elapsed += (sender, e) =>
{
// 執行任務邏輯
Console.WriteLine($"任務執行時間:{DateTime.Now}");
};
timer.AutoReset = true; // 週期性觸發
timer.Enabled = true; // 啟動
Timer 僅支援間隔,不直接支援「每日 12:00 首次執行」。常見作法:
Interval,AutoReset=false。Interval 改為 24 小時(86400000 ms),並設 AutoReset=true。DateTime now = DateTime.Now;
DateTime nextRun = now.Date.AddHours(12); // 今日 12:00
if (now > nextRun) nextRun = nextRun.AddDays(1); // 若已過,改明天
double msUntilFirst = (nextRun - now).TotalMilliseconds;
timer.Interval = msUntilFirst;
timer.AutoReset = false;
timer.Elapsed += (s, e) =>
{
// 執行任務
timer.Interval = 86400000; // 24 小時
timer.AutoReset = true;
};
timer.Start();
**最簡單、最可靠**的「按時執行」方案,適用於獨立伺服器/本機部署的 Console App 或腳本。
.exe)或腳本(.bat/PowerShell)。| 優點 | 缺點 |
|---|---|
| 系統級保證執行,不依賴應用常駐 | 需伺服器管理員權限設定 |
| 支援複雜排程(每週、每月、事件觸發) | 虛擬主機/共享主機通常無法使用 |
| 執行失敗可重試、記錄日誌 | 跨機器部署需分別設定 |
需**長期在背景運行、開機自啟、支援暫停/繼續**的專用服務程式。
OnStart 啟動 Timer/BackgroundService,OnStop 釋放資源)。IHostedService + BackgroundService 實現,跨平台部署更靈活。public partial class MyService : ServiceBase
{
private Timer _timer;
protected override void OnStart(string[] args)
{
_timer = new Timer(3600000) { AutoReset = true };
_timer.Elapsed += DoWork;
_timer.Start();
}
private void DoWork(object sender, ElapsedEventArgs e) { /* 任務邏輯 */ }
protected override void OnStop() { _timer?.Dispose(); }
}
若**無法建立 Windows Service 或排程任務**(如共享虛擬主機),常見替代方案:
/api/scheduled-task),由網站執行邏輯。if (DateTime.Now == "12:00") 判斷:毫秒級比對極易錯過;應計算精確間隔。Application_Start 啟動 Timer:應用程式池回收會導致任務中斷,且多實例部署會重複執行。try-catch 包裹任務本體。| 場景 | 推薦方案 |
|---|---|
| 獨立伺服器,需開機自啟、長期背景運行 | Windows Service / .NET Generic Host |
| 獨立伺服器,僅需簡單定時執行 .exe | Windows 排程任務 |
| WinForms/WPF 桌面應用,前台運行時定時處理 | System.Timers.Timer / DispatcherTimer |
| ASP.NET Core 託管於 IIS / Kestrel,需可靠排程 | Hangfire / Quartz.NET + 外部喚醒 或 雲端無伺服器函式 |
| 共享虛擬主機,無系統權限 | 外部排程服務呼叫網站 API 端點 |
「定時執行」看似簡單,**可靠度、部署環境、維運成本**才是選型關鍵。原則優先:**系統級排程(Task Scheduler/Windows Service)優於進程內 Timer**;雲端部署優先考慮**無伺服器排程服務**。根據實際約束選擇最適合的方案,並做好冪等、日誌與監控,才能讓定時任務真正「安心無感」地跑起來。