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
),每次检测后重置,避免并发问题。