C#:用定时器监控定时器,实现中止定时器正在执行的任务,并重启

Windows服务中使用的比较多的是定时器,但这种定时任务有个比较大的毛病:有时会莫名其妙地停止执行(长时间执行不完,假死),必须得手工重启Windows服务才能恢复正常。这个就太麻烦了。

有没有办法来实现定时器出现问题时自动重启定时器呢?我们做个小实验:

一、能否用Stop来中止定时器正在执行的任务?不行。

using System;
using System.Timers;namespace TestTimer
{internal class Program{private static int usingResource = 0;static int m = 0;static Timer timerTask = new Timer();static Timer timerMonitor = new Timer();static void Main(string[] args){//任务 定时器timerTask.AutoReset = true;timerTask.Interval = 1 * 1000;//1秒触发一次timerTask.Enabled = true;timerTask.Elapsed += TimerTask_Elapsed;timerTask.Start();//监控 定时器timerMonitor.AutoReset = true;timerMonitor.Interval = 1 * 1000;//1秒触发一次timerMonitor.Enabled = true;timerMonitor.Elapsed += TimerMonitor_Elapsed; ;timerMonitor.Start();Console.Read();}private static void TimerMonitor_Elapsed(object sender, ElapsedEventArgs e){Console.WriteLine("m={0}", m);if (m == 1){Console.WriteLine("set task stop");timerTask.Stop();}}private static void TimerTask_Elapsed(object sender, ElapsedEventArgs e){if (0 == System.Threading.Interlocked.Exchange(ref usingResource, 1)){m = new Random().Next(0, 2);//m只可能为0或1if (m == 0)Console.WriteLine("m=0 => {0:HH:mm:ss}", DateTime.Now);else{for (int i = 0; i < 999999999; i++){Console.WriteLine("m=1 => {0:HH:mm:ss}", DateTime.Now);System.Threading.Thread.Sleep(1000);}}System.Threading.Interlocked.Exchange(ref usingResource, 0);}else{Console.WriteLine("{0:yyyy-MM-dd HH:mm:ss}, 未取得锁,已退出", DateTime.Now);}}}
}

由上面代码可以得到下面的结果:

没有停止。

===================== 华丽的分隔线 =====================

二、直接中止线程来中止执行,并重启定时器:可以

下面的代码成功实现了用定时器TimerMonitor监控定时器TimerTask,如果有问题则立即中止TimerTask的线程,并实现重启TimerTask定时器的功能。

using System;
using System.Threading;
using System.Timers;
using Timer = System.Timers.Timer;namespace TestTimer
{internal class Program{private static int usingResourceTask = 0;private static int usingResourceMonitor = 0;static int m = 0;static Timer timerTask = new Timer();static Timer timerMonitor = new Timer();static Thread taskThread = null;static void Main(string[] args){//任务 定时器timerTask.AutoReset = true;timerTask.Interval = 2 * 1000;//2秒触发一次timerTask.Enabled = true;timerTask.Elapsed += TimerTask_Elapsed;timerTask.Start();//监控 定时器timerMonitor.AutoReset = true;timerMonitor.Interval = 2 * 1000;//2秒触发一次timerMonitor.Enabled = true;timerMonitor.Elapsed += TimerMonitor_Elapsed; ;timerMonitor.Start();Console.Read();}private static void TimerMonitor_Elapsed(object sender, ElapsedEventArgs e){if (0 == System.Threading.Interlocked.Exchange(ref usingResourceMonitor, 1)){Console.WriteLine("TimerMonitor {0}=> m={1}", DateTime.Now.ToString("HH:mm:ss"), m);if (m == 1)//用这个模拟出现了异常现象{m = 0;  //避免后一次快速进入Console.WriteLine("TimerMonitor {0}=> 即将中止 timerTask 线程 ", DateTime.Now.ToString("HH:mm:ss"));taskThread.Abort();Console.WriteLine("TimerMonitor {0}=> 已将 timerTask 执行停止", DateTime.Now.ToString("HH:mm:ss"));Thread.Sleep(10 * 1000);//暂停10秒,再重启定时器timerTask.Stop();Console.WriteLine("TimerMonitor {0}=> Task定时器在中止后10秒已设置为停止状态", DateTime.Now.ToString("HH:mm:ss"));//将任务的锁释放System.Threading.Interlocked.Exchange(ref usingResourceTask, 0);timerTask.Start();Console.WriteLine("TimerMonitor {0}=> Task定时器已设置为开启", DateTime.Now.ToString("HH:mm:ss"));}System.Threading.Interlocked.Exchange(ref usingResourceMonitor, 0);}else{//Console.WriteLine("TimerMonitor {0:yyyy-MM-dd HH:mm:ss}, 未取得锁,已退出", DateTime.Now);}}private static void TimerTask_Elapsed(object sender, ElapsedEventArgs e){taskThread = Thread.CurrentThread;if (0 == System.Threading.Interlocked.Exchange(ref usingResourceTask, 1)){m = new Random().Next(0, 2);//m只可能为0或1if (m == 0)Console.WriteLine("TimerTask m=0 => {0:HH:mm:ss}", DateTime.Now);else{for (int i = 0; i < 999999999; i++){Console.WriteLine("TimerTask m=1 => {0:HH:mm:ss}", DateTime.Now);System.Threading.Thread.Sleep(1000);}}System.Threading.Interlocked.Exchange(ref usingResourceTask, 0);}else{//Console.WriteLine("TimerTask {0:yyyy-MM-dd HH:mm:ss}, 未取得锁,已退出", DateTime.Now);}}}
}

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

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

相关文章

MAC苹果电脑如何使用Homebrew安装iperf3

一、打开mac终端 找到这个终端打开 二、终端输入安装Homebrew命令 Homebrew官网地址&#xff1a;https://brew.sh/ 复制这个命令粘贴到mac的终端窗口&#xff0c;然后按回车键 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/in…

引领教育变革:山海鲸可视化智慧教育方案

随着信息技术的迅猛发展&#xff0c;教育领域正迎来一场深刻的变革。山海鲸可视化智慧教育解决方案&#xff0c;以其创新的技术和丰富的应用场景&#xff0c;正成为推动教育现代化进程的重要力量。 山海鲸可视化智慧教育解决方案是一套集教学、管理、服务于一体的综合性教育系…

Vue的模块化开发初探

文章目录 Vue的模块化开发初探一 概述二 步骤2.1 下载必须模块2.2 安装Live Server插件2.3 编写代码2.4 运行结果 三 总结四 参考资料 Vue的模块化开发初探 一 概述 Vue是一个渐进式JavaScript框架&#xff0c;可以按需引入部分功能&#xff0c;而不必全量引入整个框架。 二…

【机器学习】一文掌握机器学习十大分类算法(上)。

十大分类算法 1、引言2、分类算法总结2.1 逻辑回归2.1.1 核心原理2.1.2 算法公式2.1.3 代码实例 2.2 决策树2.2.1 核心原理2.2. 代码实例 2.3 随机森林2.3.1 核心原理2.3.2 代码实例 2.4 支持向量机2.4.1 核心原理2.4.2 算法公式2.4.3 代码实例 2.5 朴素贝叶斯2.5.1 核心原理2.…

X86汇编速成

平时用的电脑都是X86的&#xff0c;但是现在大家都在搞RISC-V&#xff0c;计组也都开始以RISC-V作为示例&#xff0c;所以专门回头来补一下X86的汇编&#xff0c;方便平时使用。 寄存器register X86_64中一共有16个64位的通用寄存器&#xff0c;分别为&#xff1a; RAX, RBX,…

【鸿蒙开发】if/else条件渲染,ForEach循环渲染

if/else 使用规则 支持if、else和else if语句。if、else if后跟随的条件语句可以使用状态变量。允许在容器组件内使用&#xff0c;通过条件渲染语句构建不同的子组件。条件渲染语句在涉及到组件的父子关系时是“透明”的&#xff0c;当父组件和子组件之间存在一个或多个if语句…

磁盘管理与文件管理

文章目录 一、磁盘结构二、MBR与磁盘分区分区的优势与缺点分区的方式文件系统分区工具挂载与解挂载 一、磁盘结构 1.硬盘结构 硬盘分类&#xff1a; 1.机械硬盘&#xff1a;靠磁头转动找数据 慢 便宜 2.固态硬盘&#xff1a;靠芯片去找数据 快 贵 硬盘的数据结构&#xff1a;…

golang实现定时监控 CLOSE_WAIT 连接的数量

文章目录 go实现定时检查大量的 CLOSE_WAIT 连接背景&#xff1a;为什么监控指定端口上的 CLOSE_WAIT 连接数量原因&#xff1a;什么是CLOSE_WAITgo实现定时检查大量的 CLOSE_WAIT 连接参考 go实现定时检查大量的 CLOSE_WAIT 连接 监控指定端口的连接状态&#xff0c;特别是关…

C++中的string设计成模板的原因

查看string的文档可以发现&#xff0c;string被设计成模板&#xff0c;为什么这样设计呢&#xff1f; string文档链接&#xff1a;<string> - C Reference (cplusplus.com) 随着计算机的发展&#xff0c;出现了很多编码&#xff08;用于管理字符&#xff09;&#xff0c…

K8S容器空间不足问题分析和解决

如上图&#xff0c;今天测试环境的K8S平台出现了一个问题&#xff0c;其中的一个容器报错&#xff1a;Free disk space below threshold. Available: 3223552 bytes (threshold: 10485760B)&#xff0c;意思服务器硬盘空间不够了。这个问题怎么产生的&#xff0c;又怎么解决的呢…

力扣LCR143---子结构判定(先序递归、Java、中等题)

题目描述&#xff1a; 给定两棵二叉树 tree1 和 tree2&#xff0c;判断 tree2 是否以 tree1 的某个节点为根的子树具有 相同的结构和节点值 。 注意&#xff0c;空树 不会是以 tree1 的某个节点为根的子树具有 相同的结构和节点值 。 示例 1&#xff1a; 输入&#xff1a;tree…

抖店商家必看:“违规操作”扣除保证金2000块!这些细节要避免!

哈喽~我是电商月月 很多没经验的新手朋友开抖店都会遇到一个问题&#xff1a; 那就是开抖音小店时&#xff0c;因操作不当被扣除保证金的该怎么办&#xff1f; 实话实说&#xff0c;被判违规扣除保证金是能申诉的。但通过几率几乎是没有的 所以想要继续开店&#xff0c;只能…

eclipse .project

.project <?xml version"1.0" encoding"UTF-8"?> <projectDescription> <name>scrm-web</name> <comment></comment> <projects> </projects> <buildSpec> <buil…

HarmonyOS 开发-短视频切换实现案例

介绍 短视频切换在应用开发中是一种常见场景&#xff0c;上下滑动可以切换视频&#xff0c;十分方便。本模块基于Swiper组件和Video组件实现短视频切换功能。 效果图预览 使用说明 上下滑动可以切换视频。点击屏幕暂停视频&#xff0c;再次点击继续播放。 实现思路 使用Sw…

Linux锁的使用

一、临界资源与临界区 多线程会共享例如全局变量等资源&#xff0c;我们把会被多个执行流访问的资源称为临界资源&#xff0c;我们是通过代码访问临界资源的&#xff0c;而我们访问临界资源的那部分代码称为临界区。 实现一个抢票系统 只有一个线程抢票时 #include <ios…

Docker速成:新手变专家!

Docker介绍 容器历史 1、Chroot Jail 就是常见的chroot命令的用法。它在1979年的时候就出现了&#xff0c;被认为是最早的容器化技术之一。它可以把一个进程的文件系统隔离起来。 2、The FreeBSD Jail &#xff08;监狱&#xff09;实现了操作系统级别的虚拟化&#xff0c;他…

外包干了25天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Jeesite开源项目中ECharts折线图MarkPoint无法绘制问题的解决方案

Jeesite开源项目中ECharts折线图MarkPoint无法绘制问题的解决方案 在Jeesite开源项目的开发中&#xff0c;数据可视化是一个不可或缺的环节。ECharts作为一个功能强大的数据可视化库&#xff0c;在项目中经常被用来绘制各种图表。然而&#xff0c;在绘制折线图时&#xff0c;有…

【python】python的选择语句的三个题目

1.乘坐飞机时&#xff0c;有些航班没有行李额度&#xff0c;当乘客的行李小于等于20公斤时&#xff0c;按每公斤1.68元收费&#xff1b;大于20公斤时&#xff0c;按每公斤1.98元收费&#xff0c;编写程序计算收费情况&#xff08;保留两位小数&#xff09; air_bagfloat(input…