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

ASP.NET Web 應用程式中實作排程任務:Application_Start 啟動 Timer 與 Quartz.NET 進階方案

     編輯:關於ASP.NET

背景與挑戰

Web 應用常需定時備份、發送郵件等排程工作。外部排程器(SQL Agent、Windows Task Scheduler、Windows Service)在共享主機環境常受限或需額外費用。本文介紹在 IIS 應用程式池內自管排程的輕量方案。

基礎 Timer 實作

工作介面與實作

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

Global.asax 啟動與靜態變數防回收

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 非靜態資源回收機制釋放。

進階方案:Quartz.NET

開源排程框架,功能豐富(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專業排程功能、支援叢集與持久化引入額外套件、配置較複雜正式專案、高可用性需求
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved