Web 應用常需定時備份、發送郵件等排程工作。外部排程器(SQL Agent、Windows Task Scheduler、Windows Service)在共享主機環境常受限或需額外費用。本文介紹在 IIS 應用程式池內自管排程的輕量方案。
public interface ISchedulerJob { void Execute(); }
public class SampleJob : ISchedulerJob {
public void Execute() {
string path = @"C:\Users\Jack\Desktop\AutoRun\AutoRun\SchedulerJob\SchedulerJob.txt";
string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
bool isNew = !File.Exists(path);
using (var sw = new StreamWriter(path, true, Encoding.Default)) {
if (isNew) sw.Write("排程任務測試開始:");
sw.WriteLine(time);
}
}
}
public class SchedulerConfiguration {
public int SleepInterval { get; private set; }
public ArrayList Jobs { get; } = new ArrayList();
public SchedulerConfiguration(int interval) { SleepInterval = interval; }
}
public class Scheduler {
private readonly SchedulerConfiguration _config;
public Scheduler(SchedulerConfiguration config) { _config = config; }
public void Start() {
while (true) {
foreach (ISchedulerJob job in _config.Jobs) {
new Thread(job.Execute).Start();
}
Thread.Sleep(_config.SleepInterval);
}
}
}
public class Global : HttpApplication {
private static Timer _timer;
protected void Application_Start() {
var config = new SchedulerConfiguration(5000);
config.Jobs.Add(new SampleJob());
_timer = new Timer(_ => new Scheduler(config).Start(), null, 0, Timeout.Infinite);
}
}
關鍵點:將 Timer 宣告為 static,避免被 IIS 非靜態資源回收機制釋放。
開源排程框架,功能豐富(Cron 運算式、叢集、持久化),生產環境建議採用。
public class TimeJob : IJob {
public void Execute(IJobExecutionContext context) { /* 任務邏輯 */ }
}
public class Global : HttpApplication {
protected void Application_Start() {
var job = JobBuilder.Create<TimeJob>().WithIdentity("job1", "group1").Build();
var trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
.Build();
var sched = StdSchedulerFactory.GetDefaultScheduler();
sched.ScheduleJob(job, trigger);
sched.Start();
}
}
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| Timer + 靜態變數 | 零依賴、極簡單 | 無持久化、無叢集、應用程式池回收即失效 | 簡單內部工具、低頻任務 |
| Quartz.NET | 專業排程功能、支援叢集與持久化 | 引入額外套件、配置較複雜 | 正式專案、高可用性需求 |