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

ASP.NET 內建排程任務實作:使用 Timer 與自我喚醒機制避免應用程式池回收中斷

     編輯:ASP.NET 基礎

不依賴 Windows 排程器或外部服務,純粹使用 ASP.NET 內部機制實現定時任務。關鍵在於 Global.asax 中啟動 System.Timers.Timer,並透過 Session_End 中發出 HTTP 請求喚醒已回收的應用程式池。

Global.asax 完整實作

void Application_Start(object sender, EventArgs e)
{
    // 啟動定時器:每 1 秒觸發一次
    System.Timers.Timer myTimer = new System.Timers.Timer(1000);
    myTimer.Elapsed += new System.Timers.ElapsedEventHandler(TaskAction.SetContent);
    myTimer.Enabled = true;
    myTimer.AutoReset = true; // 週期性觸發
}

void Session_End(object sender, EventArgs e)
{
    // 關鍵:解決 IIS 應用程式池自動回收導致 Timer 停止的問題
    System.Threading.Thread.Sleep(1000);
    TaskAction.SetContent(); // 執行一次任務邏輯

    // 發出 HTTP 請求喚醒應用程式,觸發 Application_Start 重新啟動 Timer
    string url = "https://your-domain.com/YourPage.aspx"; // 替換為實際可存取的 URL
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
    Stream receiveStream = resp.GetResponseStream();
    // 讀取串流確保請求完成...
}

排程任務類別 TaskAction

public static class TaskAction
{
    private static string content = "";
    public static string Content 
    { 
        get { return content; } 
        set { content += "<div>" + value + "</div>"; } 
    }

    // 定時器觸發的委派方法 (符合 ElapsedEventHandler 簽名)
    public static void SetContent(object source, ElapsedEventArgs e)
    {
        Content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
    }

    // Session_End 喚醒時呼叫的無參數版本
    public static void SetContent()
    {
        Content = "END: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
    }
}

前台顯示頁面 Default.aspx

<div><%= TaskAction.Content %></div>

運作原理圖解

  1. 應用程式首次啟動 → Application_Start 建立 Timer → 每秒執行 TaskAction.SetContent
  2. IIS 應用程式池閒置回收 → Timer 隨之停止
  3. 有新 Session 建立並結束 → 觸發 Session_End
  4. Session_End 執行任務邏輯 → 發送 HTTP 請求至自身網站
  5. 請求喚醒應用程式池 → 觸發 Application_Start → Timer 重新啟動

關鍵限制與注意事項

  • Session 模式必須為 InProc:web.config 中 <sessionState mode="InProc" />,StateServer 或 SQLServer 模式不會觸發 Session_End
  • 喚醒 URL 必須可存取:需指向網站內任一實際頁面,確保 IIS 接收請求後啟動應用程式
  • 精確度有限:受限於 IIS 閒置逾時 (預設 20 分鐘) 與請求觸發時機,非即時排程
  • 生產環境建議:重要任務仍建議使用 Windows Service、Hangfire、Quartz.NET 或 Azure WebJobs 等專業排程框架

執行結果示意

排程任務輸出結果

畫面會每秒更新一次時間戳記,應用程式池回收後經喚醒機制自動恢復運作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved