C# 看门狗策略实现

发布于:2025-04-15 ⋅ 阅读:(25) ⋅ 点赞:(0)
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();
    }
}

核心设计要点:

  1. 心跳机制
    被监控的任务需定期更新 _lastHeartbeat(示例中每1秒更新一次),看门狗通过检查心跳时间判断是否存活。

  2. 超时判定
    若超过 TimeoutThreshold(示例10秒)未收到心跳,判定为任务冻结,触发重启。

  3. 安全重启

    • 使用 Thread.Abort() + Join() 确保旧任务终止

    • 创建新线程并更新心跳时间戳

  4. 线程安全

    • 使用 lock 保护共享数据 _lastHeartbeat

    • volatile 关键字确保布尔标志的可见性

  5. 定时器模式
    采用单次触发定时器Timeout.Infinite),每次检测后重置,避免并发问题。