在 Global.asax Application_Start 啟動背景執行緒,Application_End 停止。
GetSleepTime(targetHour, min, sec) 算出距離下一個目標時間的 ms,Thread.Sleep 直接休眠 → 精準、低佔用,但難中途取消。Monitor.Pulse)實現優雅停止:private readonly object locker = new object();
private bool isStart = true;
private void Run()
{
while (isStart)
{
int sleep = GetSleepTime(19, 0, 0); // 每天 19:00
lock (locker) { Monitor.Wait(locker, sleep); }
if (isStart) SendWeatherReport();
}
}
// 停止時
isStart = false;
lock (locker) { Monitor.Pulse(locker); }
GetSleepTime 處理跨午夜邏輯(負值加 24h)。此模式適用於任何固定時點/間隔的背景作業。