• 神奇的Timer


    最近的一个项目有一些地方需要用到定时功能,在设计过程中,突然发现.net的Timer类居然还有很多我以前没有用过的功能,这里就跟大家分享一下

    注:这里的Timer类特指System.Threading.Timer类

    情景1:我需要服务器在每天的00:00点执行一个操作

    我当开始想到的方法很2b,居然是设定定时器每个1分钟去检查时间,如果当前时间与00:00相差不超过1分钟时,就执行操作!!!由于这段的代码太过2b,所以就不放上来了!

    我都不知道自己刚开始怎么会想到如此2的设计,几乎刚把代码写完我自己就把这个方案个否定了,极度浪费资源不说,还不能精准的在00:00执行操作!

    于是我又一次查看了msdn,msdn真是编程神器啊,现在我离开了它简直是寸步难行了,我惊喜的发现Timer的构造函数中有这样一个参数

    这个dueTime参数不正是我需要的吗?只不过我以前一般忽略了这个参数,直接将其置为0了!所以我立刻写下了下面的代码

    var span = DateTime.Today.AddDays(1) - DateTime.Now;
     var timer = new Timer(callback, null, (int)span.TotalMilliseconds, 24 * 3600 * 1000);

    于是在第二天的00:00,定时器就开始执行,然后每隔24小时执行一次,这样就完美的达到了情景中的目标!

    情景2:我需要每个5分钟保存一次RichTextBox中的内容

    这实际上就是一个类似Word的自动保存功能,刚开始我觉得很简单,不就是定义一个5分钟的定时器就了事吗?后来想想不这么简单,因为如果用户不在RichTextBox更改任何内容,这是还是隔5分钟保存一次就是资源浪费!于是可以将上述情景更加精确的描述为:

    在用户每次对RichTextBox的内容修改之后的5分钟时,对RichTextBox中内容保存一次!

    这样又如何去实现呢?于是我又一次查看了MSDN,果然没让我失望,MSDN又一次给了我惊喜,请看下面的MSDN说明

    这句话简直就是为了解决情境中的问题说的啊!于是我立刻写下了下面的代码:

    System.Threading.Timer timer = null;
            bool needSave = false;
            private void richTextBox1_TextChanged(object sender, EventArgs e)
            {
                if (timer == null)
                    timer = new System.Threading.Timer(Callback, null, 5 * 60 * 1000, 0);
                else if (needSave)
                {
                    needSave = false;
                    timer.Change(5 * 60 * 1000, 0);
                }
            }
            void Callback(object state)
            {   
                Save();
                needSave = true;
            }
    将period参数置为0,就意味着定时器只会执行一次,此时定时功能是依靠参数dueTime来实现的,Change函数可以重启定时功能,并且每次RichTextBox中有内容的改变,定时器就会被重置,这样就完美的解决了情境中的问题了!

     

    以上图片由“博客园”提供

  • 相关阅读:
    babel-loader的原理
    js弱类型转换的知识点
    个人说明
    嗯三月的小计划
    bzoj2326 [HNOI2011]数学作业
    bzoj2654 tree
    bzoj1018[SHOI2008]堵塞的交通traffic
    bzoj1937[Shoi2004]Mst 最小生成树
    一般图最大匹配-带花树-带注释模板
    FFT快速傅里叶变换-递归版-带注释模板
  • 原文地址:https://www.cnblogs.com/ldyblogs/p/timer.html
Copyright © 2020-2023  润新知