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