当前位置: 首页 > news >正文

C# 看门狗策略实现

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

相关文章:

  • JavaScript:游戏开发的利器
  • LangChain-输出解析器 (Output Parsers)
  • Python设计模式:命令模式
  • c++自学笔记——字符串与指针
  • Android 手机指纹传感器无法工作,如何恢复数据?
  • 四旋翼无人机手动模式
  • 在kotlin的安卓项目中使用dagger
  • 【CompletableFuture】异步编程
  • 每天五分钟玩转深度学习PyTorch:搭建LSTM算法模型完成词性标注
  • 使用libcurl编写爬虫程序指南
  • UE4模型导入笔记
  • 若依 前后端部署
  • 聊透多线程编程-线程基础-4.C# Thread 子线程执行完成后通知主线程执行特定动作
  • KWDB创作者计划—KWDB技术重构:重新定义数据与知识的神经符号革命
  • 网络机顶盒常见问题全解析:从安装到故障排除
  • 使用 VBA 宏创建一个选择全部word图片快捷指令,进行图片格式编辑
  • vba讲excel转换为word
  • 从One-Hot到TF-IDF:NLP词向量演进解析与业务实战指南
  • 初版纳米AI_git pull分支关联关系
  • 如何降低论文的AIGC检测率,减少“AI味”