using System;
using System.Threading;public class Watchdog
{private Timer _timer;private volatile bool _isTaskAlive;private readonly object _lock = new object();private const int CheckInterval = 5000; // 5秒檢測一次private const int TimeoutThreshold = 10000; // 10秒無響應判定為超時// 被監控的任務(示例用線程模擬)private Thread _monitoredTask;private DateTime _lastHeartbeat;public void Start(){// 啟動被監控的任務_monitoredTask = new Thread(MonitoredTaskWork);_monitoredTask.Start();// 初始化看門狗定時器_timer = new Timer(CheckStatus, null, CheckInterval, Timeout.Infinite);}// 被監控的任務模擬(需定期發送心跳)private void MonitoredTaskWork(){try{while (true){// 模擬工作邏輯Thread.Sleep(1000);// 發送心跳lock (_lock){_lastHeartbeat = DateTime.Now;}}}catch (ThreadAbortException){// 任務被終止時清理}}// 看門狗狀態檢查private void CheckStatus(object state){lock (_lock){if ((DateTime.Now - _lastHeartbeat).TotalMilliseconds > TimeoutThreshold){Console.WriteLine("?? 任務無響應,觸發重啟...");RestartTask();}}// 重置定時器(單次觸發模式)_timer.Change(CheckInterval, Timeout.Infinite);}// 重啟任務private void RestartTask(){try{if (_monitoredTask != null && _monitoredTask.IsAlive){_monitoredTask.Abort();_monitoredTask.Join(1000);}}finally{_monitoredTask = new Thread(MonitoredTaskWork);_monitoredTask.Start();_lastHeartbeat = DateTime.Now;}}// 停止看門狗public void Stop(){_timer?.Dispose();_monitoredTask?.Abort();}
}// 使用示例
class Program
{static void Main(){var watchdog = new Watchdog();watchdog.Start();Console.WriteLine("看門狗已啟動,按任意鍵退出...");Console.ReadKey();watchdog.Stop();}
}
核心設計要點:
-
心跳機制
被監控的任務需定期更新?_lastHeartbeat
(示例中每1秒更新一次),看門狗通過檢查心跳時間判斷是否存活。 -
超時判定
若超過?TimeoutThreshold
(示例10秒)未收到心跳,判定為任務凍結,觸發重啟。 -
安全重啟
-
使用?
Thread.Abort()
?+?Join()
?確保舊任務終止 -
創建新線程并更新心跳時間戳
-
-
線程安全
-
使用?
lock
?保護共享數據?_lastHeartbeat
-
volatile
?關鍵字確保布爾標志的可見性
-
-
定時器模式
采用單次觸發定時器(Timeout.Infinite
),每次檢測后重置,避免并發問題。