Timer应用之Interval优化
开发中, 有时有这种场景,使用 Timer 的 Timer_Elapsed 间隔 执行(如:从数据库)获取数据 与 现有 应用服务器中的 静态变量数据(起到缓存的目的)做 对比 ,若有改变,则 更新当前 静态变量的数据,从而使 数据不再是过期数据,可以继续被使用的目的。
一般来说,直接使用 Timer 的 Timer_Elapsed 也可以,就是 为了 数据比对,达到效果和目的就行。
不过在使用过程中,发现自己定义 的静态变量数据,一般很少情况下,才发生变化, 而 Timer_Elapsed 又总是 固定的时间 Interval 去执行,这样多少有些浪费资源。
为了减少 Timer_Elapsed 的执行,就需要 控制 间隔Interval,就此我写了一个类控制 Interval 的类。
原理: 将 Timer_Elapsed 中的 “是否变化” 记录下来,然后 积累多次(集合存储)的变化后,对其 取 LastCount 个 “是否变化”, 如果 取出来的 都是 没有变化,则 Interval 累加 1秒,然后 再提升 LastCount 的个数,以便下次 取更多 “是否变化”,
来确定 是否可以 再次 Interval 累加 1秒。一直持续,当然得控制 Interval 的最大值 ,防止过大失去 更新到最新数据 的作用。还要提供一个 特殊情况,需要 重置 ,重新开始 收集 “是否变化”进行计算 的功能。
效果:
类代码如下:
/// <summary>
/// 管理 Timer 的 Interval
///
/// 在 Timer 的 Timer_Elapsed 事件中 InsertChangePoint(通过逻辑 得出 这一点的数据是否有变化),将 这一点变化记录下来,
///
/// 积累多次 数据变化点,来进行判断 该变 Timer 的 Interval,从而达到 减少 Timer_Elapsed 执行次数的目的,优化Timer 的作用。
///
/// </summary>
public class IntervalMgr
{
public Timer ExecTimer { get;private set; } /// <summary>
/// Timer默认间隔 单位(毫秒)
/// </summary>
public double DefInterval { get; private set; } /// <summary>
/// 记录变化点的容器
/// </summary>
public List<bool> LstChangePoint
{
get; private set;
} /// <summary>
/// 每次递增的断定个数
/// </summary>
public int IncLastCount { get; private set; } /// <summary>
/// 初始断定个数
/// </summary>
private int LastCount = ; /// <summary>
/// 最大执行间隔 单位(毫秒)
/// </summary>
public double MaxInterval { get; private set; } /// <param name="execTimer">间隔执行的Timer</param>
/// <param name="defInterval">execTimer的默认间隔事件 单位(毫秒)</param>
/// <param name="incLastCount">递增数</param>
/// <param name="maxInterval">最大执行间隔 单位(毫秒)</param>
public IntervalMgr(Timer execTimer, double defInterval,int incLastCount,double maxInterval = ( * * ))
{
this.ExecTimer = execTimer;
this.DefInterval = defInterval;
this.LastCount = incLastCount;
this.IncLastCount = incLastCount;
this.MaxInterval = maxInterval;
this.LstChangePoint = new List<bool>();
} /// <summary>
/// 在 Timer_Elapsed 事件 调用 InsertChangePoint
/// </summary>
/// <param name="isChange">(检测数据)是否发生变化</param>
public void InsertChangePoint(bool isChange)
{
LstChangePoint.Add(isChange);
Console.WriteLine("LastCount:"+ LastCount + "\r\nLstChangePoint.Count:" + LstChangePoint.Count + "\r\nLstChangePoint:" + string.Join(",", LstChangePoint)); if (CanJudg(LastCount))
{
if (JudgIsNotChange(LastCount))
{
if ((ExecTimer.Interval + ) < MaxInterval)// 小于 最大间隔,则 继续累加 1 秒 。
{
ExecTimer.Interval = (ExecTimer.Interval + );
LastCount = LastCount + IncLastCount; //下次 要累加 1秒 所需的 检测变化的个数
}
else
{
ExecTimer.Interval = MaxInterval; //大于 最大间隔,则以 最大间隔 进行执行
LstChangePoint.RemoveRange(, );
}
}
else
{
//一旦有变化则重置。
ReStart();
}
}
} /// <summary>
/// 特殊情况下,需要执行重置方法
/// </summary>
public void ReStart()
{
LstChangePoint.Clear();
ExecTimer.Interval = DefInterval;
LastCount = IncLastCount;
} /// <summary>
/// 是否可以断定最后 lastCout 个变化点
/// </summary>
/// <param name="lastCout"></param>
/// <returns></returns>
private bool CanJudg(int lastCout)
{
if (lastCout <= )
{
return false;
}
return LstChangePoint.Count >= lastCout;
} /// <summary>
/// 最后 lastCout 个都没变化?
/// </summary>
/// <param name="lastCout"></param>
/// <returns></returns>
private bool JudgIsNotChange(int lastCout)
{
if (LstChangePoint.Count >= lastCout)
{
var lstTake = LstChangePoint.Skip(LstChangePoint.Count - lastCout).Take(lastCout).ToList();
return lstTake.TrueForAll(t => !t);//全部都为false,则就是全部都没有进行过变化
}
else
{
throw new Exception("积累的变化点还不足以判断出最后" + lastCout + "个变化点是否都发生变化!");
}
}
}
测试Demo: https://files.cnblogs.com/files/lztkdr/IntervalMgrDemo.zip
Timer应用之Interval优化的更多相关文章
- 利用libevent的timer实现定时器interval
在不怎么了解libevent的情况下,看到timer这个关键字想到可以用来做定时任务,官方资料也不齐全,就从代码里看到了TIMEOUT字样,这么说来应该是支持timeout了,那interval呢,貌 ...
- angular性能优化心得
原文出处 脏数据检查 != 轮询检查更新 谈起angular的脏检查机制(dirty-checking), 常见的误解就是认为: ng是定时轮询去检查model是否变更.其实,ng只有在指定事件触发后 ...
- AngularJS性能优化心得,自己踩过的抗,及一些别人的经验(转哦)
脏数据检查 != 轮询检查更新 谈起angular的脏检查机制(dirty-checking), 常见的误解就是认为: ng是定时轮询去检查model是否变更.其实,ng只有在指定事件触发后,才进入$ ...
- Kanzi编程基础1 - 定时器Timer
Kanzi虽然发生了比较多的版本更迭,api也发生了很多变化,但定时器的头文件一直都在一个地方:#include "user/include/user/ui/message/kzu_mess ...
- System.Windows.Forms.Timer反编译学习
using System; using System.ComponentModel; using System.Globalization; using System.Runtime; using S ...
- System.Windows.Forms.Timer
一.主要属性.方法和事件 Windows 窗体 Timer 是定期引发事件的组件.该组件是为 Windows 窗体环境设计的. 时间间隔的长度由 Interval 属性定义,其值以毫秒为单位.若启用了 ...
- [置顶] STM32移植contiki进阶之三(中):timer 中文版
鉴于自己英语水平不高,在这里,将上一篇关于contiki 的timer的文章翻译为中文,让自己在学习的时候,更方便点.文中有许多不是很通顺的地方,将就吧. Timers Contiki系统提供了一套时 ...
- setTimeout模拟interval
/** * @param fn: {Function} // function which to execute * @param timer: {number} // gap time betwee ...
- Linux时间子系统之二:Alarm Timer
一.前言 严格来讲Alarm Timer也算POSIX Timer一部分,包含两种类型CLOCK_REALTIME_ALARM和CLOCK_BOOTTIME_ALARM.分别是在CLOCK_REALT ...
随机推荐
- 几个实用的sublime text 2的快捷键
Sublime text快捷键 Sublime text 2是一款轻量.简洁.高效.跨平台的编辑器,他适合编写javascript,html,css,php,paython等等, 作为程序员,编码效率 ...
- C# FileSystemWatcher 在监控文件夹和文件时的用法
概述 最近学习FileSystemWatcher的用法,它主要是监控一个文件夹,当文件夹内的文件要是有更改就要记录下来,我就整理下我对FileSystemWatcher 的理解和用法. FileSys ...
- WAMP运行分析
- 【Cesium】模型转换和使用(转)
http://52.4.31.236/convertmodel.html https://blog.csdn.net/UmGsoil/article/details/74572877 var view ...
- 【代码审计】CLTPHP_v5.5.3后台任意文件删除漏洞分析
0x00 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chich ...
- SaltStack Grains 和 Pillar
Grains: (1) grains 是服务器的一系列粒子信息,也就是服务器的一系列物理,软件环境信息(2) grains 是 minion 启动时收集到的一些系统信息,比如操作系统版本.内核版本.C ...
- zabbix创建触发器
1. 增加触发器 配置-->主机-->选择主机-->创建触发器 2. 配置触发器 3.查看触发器的状态 如果有问题会显示红色的问题
- [XPath] XPath 与 lxml (一)XPath 术语
前言 这是一篇主要介绍 XPath 的文章,由于 JQuery 已经不支持 XPath,所以本文主要通过 Python 的 lxml.etree 来介绍 XPath. 什么是 XPath ? XPat ...
- [OSX] 使用 MacPorts 安装 Python 和 pip 指南
Mac OS 未预装任何在 Unix/Linux 中常见的命令行包管理工具,Mac OS 中的 App Store 和自身的软件升级功能可以下载更新许多比较好的应用,但这些应用多数是满足普通消费者需求 ...
- log4net日志的简单配置
说起来log4net,我一直都知道这个的存在,但实际在项目中还真是没有去自己写过的那,这一次我在项目完成后并没有着急下一个项目的开始,于是突然想起来是否添加一个日志的编写,于是开始了log4net的总 ...