zoukankan      html  css  js  c++  java
  • 神奇的Timer

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

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

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

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

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

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

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

    1 var span = DateTime.Today.AddDays(1) - DateTime.Now;
    2 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说明

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

     1 System.Threading.Timer timer = null;
     2         bool needSave = false;
     3         private void richTextBox1_TextChanged(object sender, EventArgs e)
     4         {
     5             if (timer == null)
     6                 timer = new System.Threading.Timer(Callback, null, 5 * 60 * 1000, 0);
     7             else if (needSave)
     8             {
     9                 needSave = false;
    10                 timer.Change(5 * 60 * 1000, 0);
    11             }
    12         }
    13         void Callback(object state)
    14         {   
    15             Save();
    16             needSave = true;
    17         }
    将period参数置为0,就意味着定时器只会执行一次,此时定时功能是依靠参数dueTime来实现的,Change函数可以重启定时功能,并且每次RichTextBox中有内容的改变,定时器就会被重置,这样就完美的解决了情境中的问题了!
            
  • 相关阅读:
    游戏编程模式之原型模式
    游戏编程模式之观察者模式
    游戏编程模式之享元模式
    游戏编程模式之命令模式
    数据库系统概论(二):关系数据库
    数据库系统概论(一):绪论
    [Unity] Unity Cursor 设置和API解析
    HDU 5492 Find a path
    HDU 1317 XYZZY
    Codeforces 508D Tanya and Password
  • 原文地址:https://www.cnblogs.com/ILoveSleep/p/3133322.html
Copyright © 2011-2022 走看看