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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Font Awesome Web 应用图标

1. 什么是 Font Awesome Web 应用图标 Font Awesome Web 应用图标是 Font Awesome 图标库中与 Web 开发相关的子集,适用于界面设计、用户交互和功能标识。 定义与作用 定义:这些图标包括导航(如“主页”)、操作(如“…

如何实现H5端对接钉钉登录并优雅扩展其他平台

如何实现H5端对接钉钉登录并优雅扩展其他平台 钉钉H5登录逻辑后端代码如何实现?本次采用策略模式工厂方式进行定义接口确定会使用的基本鉴权步骤具体逻辑类进行实现采用注册表模式(Registry Pattern)抽象工厂进行基本逻辑定义具体工厂进行对接…

STM32F103C8T6单片机开发:简单说说单片机的外部GPIO中断(标准库)

目录 前言 如何使用STM32F1系列的标准库完成外部中断的抽象 初始化我们的GPIO为输入的一个模式 初识GPIO复用,开启GPIO的复用功能时钟 GPIO_EXTILineConfig和EXTI_Init配置外部中断参数 插入一个小知识——如何正确的配置结构体? 初始化中断&#…

【自然语言处理】深度学习中文本分类实现

文本分类是NLP中最基础也是应用最广泛的任务之一,从无用的邮件过滤到情感分析,从新闻分类到智能客服,都离不开高效准确的文本分类技术。本文将带您全面了解文本分类的技术演进,从传统机器学习到深度学习,手把手实现一套…

Java Lambda与方法引用:函数式编程的颠覆性实践

在Java 8引入Lambda表达式和方法引用后,函数式编程范式彻底改变了Java开发者的编码习惯。本文将通过实战案例和深度性能分析,揭示如何在新项目中优雅运用这些特性,同时提供传统代码与函数式代码的对比优化方案。 文章目录 一、Lambda表达式&a…

剑指offer经典题目(三)

目录 动态规划入门 二进制运算 链表相关 动态规划入门 题目1:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算 不同的结果)。OJ地址 简单图示如下。 题目分析&#…

【每日随笔】丛林法则 ( 弱肉强食 | 适者生存 | 资源有限稀缺 | 没有道德约束 | 自发性与无序性 | 丛林法则映射 - 资源分配 与 社会分层 )

文章目录 一、丛林法则1、弱肉强食2、适者生存3、资源有限稀缺4、没有道德约束5、自发性与无序性6、丛林法则映射 - 资源分配 与 社会分层 一、丛林法则 丛林法则 是 在 资源有限 的环境中 , 竞争 是生存的基础 , 弱肉强食 , 适者生存 , 且过程 不受道德约束 ; 丛林法则 在 自…

【含文档+PPT+源码】基于小程序的智能停车管理系统设计与开发

项目视频介绍: 毕业作品基于小程序的智能停车管理系统设计与开发 课程简介: 本课程演示的是一款基于小程序的智能停车管理系统设计与开发,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:…

Navicat连接远程PostGreSQL失败

问题描述 使用本地Navicat连接Windows远程服务器上部署的PostGreSQL数据库时,出现以下错误: 解决方案 出现以上报错信息,是因为PostGreSQL数据库服务尚未设置允许客户端建立远程连接。可做如下配置, 1. 找到PostGreSQL数据库安装目录下的data子文件夹,重点关注:postgres…

【Linux】jumpserver开源堡垒机部署

JumpServer 安装部署指南 本文档详细记录了 JumpServer 安装部署的过程、核心脚本功能说明以及后续管理使用提示,方便运维人员快速查阅和二次安装。 1. 前提条件 操作系统要求: 仅支持 Linux 系统,不支持 Darwin(macOS&#xff0…

餐饮厨房开源监控安全系统的智能革命

面对日益严格的合规要求和消费者对卫生的信任危机,传统人工监督已力不从心:卫生死角难发现、违规操作难追溯、安全隐患防不胜防。如何让后厨更透明、更安全、更可信?餐饮厨房视频安全系统横空出世!这套系统融合实时监控与AI技术&a…

HashMap为什么扩容为原来2倍呢?

1、减少哈希碰撞 核心原因:HashMap的所有设计都依赖于数组长度为2的幂次方这一前提。 索引计算使用 (n-1)&hash ,其中 n 是数组长度当 n 是 2 的幂次方时,n-1 的二进制形式是全 1(例如,15——>111…

debian系统中文输入法失效解决

在 Debian 9.6 上无法切换中文输入法的问题通常与输入法框架(如 Fcitx 或 IBus)的配置或依赖缺失有关。以下是详细的解决步骤: 1. 安装中文语言包 确保系统已安装中文语言支持: sudo apt update sudo apt install locales sudo…

3DGS之光栅化

光栅化(Rasterization)是计算机图形学中将连续的几何图形(如三角形、直线等)转换为离散像素的过程,最终在屏幕上形成图像。 一、光栅化的核心比喻 像画家在画布上作画 假设你是一个画家,要把一个3D立方体画…

学习51单片机Day02---实验:点亮一个LED灯

目录 1.先看原理图 2.思考一下(sbit的使用): 3.给0是要让这个LED亮(LED端口设置为低电平) 4.完成的代码 1.先看原理图 比如我们要让LED3亮起来,对应的是P2^2。 2.思考一下(sbit的使用&…

Redis与Lua原子操作深度解析及案例分析

一、Redis原子操作概述 Redis作为高性能的键值存储系统,其原子性操作是保证数据一致性的核心机制。在Redis中,原子性指的是一个操作要么完全执行,要么完全不执行,不会出现部分执行的情况。 Redis原子性的实现原理 单线程模型&a…

深入理解 GLOG_minloglevel 与 GLOG_v:原理与使用示例

文章目录 深入理解 GLOG_minloglevel 与 GLOG_v:原理与使用示例1. GLOG_minloglevel:最低日志等级控制2. GLOG_v:控制 VLOG() 的详细输出等级3. GLOG_minloglevel 与 GLOG_v 的优先级关系4. 使用示例4.1 基础示例:不同日志等级4.2…

Cline Memory Bank 结构化文档持久化 AI 上下文详解

🎮 什么是 Cline Memory Bank? Memory Bank 是一个结构化文档系统,允许 Cline 在会话之间保持上下文。它能让 Cline 从无状态的助手转变为持久记忆的开发伙伴,随着时间推移有效地“记住”项目细节。 🗡️ 关键优势 上…

【JavaScript】面向对象与设计模式

个人主页:Guiat 归属专栏:HTML CSS JavaScript 文章目录 1. JavaScript 中的面向对象编程1.1 对象基础1.2 构造函数1.3 原型和原型链1.4 ES6 类1.5 继承1.6 封装 2. 创建型设计模式2.1 工厂模式2.2 单例模式2.3 建造者模式2.4 原型模式 3. 结构型设计模式…

网络安全防护技术

边界安全防护——防火墙 控制:在网络连接点上建立一个安全控制点,对进出数据进行限制隔离:将需要保护的网络与不可信任网络进行隔离,隐藏信息并进行安全防护记录:对进出数据进行检查,记录相关信息 防火墙…