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

ASP.NET 在 Global.asax 中使用 Timer 定時任務

     編輯:關於ASP.NET

在 `Application_Start` 啟動 `System.Timers.Timer`,可實現背景定時作業(如快取預熱、資料同步、清理過期資料)。

實作代碼

<%@ Import Namespace="System.Timers" %>
<script runat="server">
    private static Timer _timer;

    void Application_Start(object sender, EventArgs e)
    {
        _timer = new Timer(60000); // 60 秒
        _timer.Elapsed += Timer_Elapsed;
        _timer.AutoReset = true;
        _timer.Enabled = true;

        Application.Lock();
        Application["LastRun"] = DateTime.Now;
        Application.UnLock();
    }

    void Timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Application.Lock();
        Application["LastRun"] = DateTime.Now;
        // 執行定時任務:同步資料、清理快取、發送郵件等
        DoBackgroundWork();
        Application.UnLock();
    }

    void Application_End(object sender, EventArgs e)
    {
        _timer?.Dispose();
    }

    void DoBackgroundWork()
    {
        // 實際業務邏輯
    }
</script>

前端驗證頁面

<%@ Page Language="C#" %>
<%= Application["LastRun"] %>
<meta http-equiv="refresh" content="10" />

關鍵注意事項

風險說明對策
應用程式池回收IIS 預設 29 小時/閒置 20 分鐘回收,Timer 會停止設定固定間隔回收、關閉閒置超時、或用 Windows Service/排程器
多執行個體 (Web Farm)每台伺服器各跑一份 Timer,重複執行分散式鎖、或僅指定一台跑背景任務
非受控執行緒例外Timer 執行緒拋出未捕獲例外會終結進程`Elapsed` 事件內全包 `try-catch`、記錄日誌不拋出
Application 鎖爭用高頻寫入 `Application` 會阻塞請求執行緒改用 `static` 變數 + `lock`、或 `ConcurrentDictionary`

生產級替代方案

  1. Hangfire / Quartz.NET:持久化、分散式、支援 Cron、重試、儀表板。
  2. Windows Service + Topshelf:脫離 IIS 生命週期,穩定可靠。
  3. Azure WebJobs / Functions:雲原生、按執行付費、自動擴縮。
  4. IHostedService (ASP.NET Core):標準化背景服務介面,支援 DI、優雅關閉。

僅建議在**單機、低頻、非關鍵**任務(如每日靜態報表生成)使用此簡易 Timer 方案。

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