Timer简单介绍

构造函数

通过ILSpy反编译可以看到Timer的内部代码。

Timer 的默认构造函数里赋了初值,所以当我们初始化Timer的时候,已经有了默认值。

Timer 的带参数的构造函数会重新给 interval(获取或设置引发 Elapsed 事件的间隔,以毫秒为单位。)赋值。

Elapsed事件(达到间隔时发生)

匿名函数传递

System.Timers.Timer t = new System.Timers.Timer( *  * ); //实例化,设置时间间隔为十分钟,此处参数单位为毫秒。//匿名函数传递
t.Elapsed += (s, e) =>
{
print(DateTime.Now);
};

非匿名函数传递

System.Timers.Timer t = new System.Timers.Timer( *  * ); //实例化,设置时间间隔为十分钟,此处参数单位为毫秒。
t.Elapsed += new System.Timers.ElapsedEventHandler((s, e) => print(DateTime.Now));//非匿名函数传递

下面是写在 Global.asax.cs 里例子,项目启动的时候会执行:

//第一个访问网站的用户会触发该方法。
protected void Application_Start()
{
DateTime dt = DateTime.Now;
System.Timers.Timer t = new System.Timers.Timer( * * ); //实例化,设置时间间隔为十分钟,此处参数单位为毫秒
t.Elapsed += new System.Timers.ElapsedEventHandler((s, e) => print(dt));
t.AutoReset = true; //每到指定时间Elapsed事件是触发一次(false),一直触发(true)
t.Enabled = true; //是否触发Elapsed事件
t.Start();
}

定时器

现在我们有个需求,需要每天12点来触发 print 方法,那么我们需要利用 Timer 写一个定时器。通过更改 Interval 属性的数值,来调整触发方法的时间。

下面是demo

private static readonly System.Timers.Timer Timer = new System.Timers.Timer(); //初始化。
private static DateTime dt = new DateTime(); //固定时间。 /// <summary>
/// 程序入口(自行调用)
/// </summary>
/// <param name="timing">定时时间(格式:年月日时分秒)</param>
public void Init()
{
dt = DateTime.Now;
SetInterval();
Timer.Elapsed += new System.Timers.ElapsedEventHandler((s, e) => SetInterval());
} /// <summary>
/// 定时器
/// </summary>
/// <param name="timing">定时时间(格式:年月日时分秒)</param>
private void SetInterval()
{
Timer.Stop();
var now = DateTime.Now;
if (now >= dt)//如果当前时间>=定时时间
{
//定时结束之后,你要执行的代码
print(now);
//----------------------------------------------------------
//此处可修改dt。更改需求。
//----------------------------------------------------------
dt = DateTime.Now.Date.AddDays().AddHours(); //重新计算定时时间,第二天12点再执行。
//dt = DateTime.Now.AddMinutes(0.1);//重新计算定时时间,每分钟执行一次。
SetInterval();
}
else//如果当前时间<定时时间
{
Timer.Interval = dt.Subtract(now).TotalMilliseconds;//重新计算定时时间,按毫秒计算。
Timer.Start();
}
} /// <summary>
/// 测试输出
/// </summary>
public void print(DateTime dt)
{
num++;
Console.WriteLine("执行第{0}次,时间:{1}", num, dt);
}

固定时间定时器

效果:

现在需求变更为每天11点到下午17点的时候触发,间隔1分钟。

下面是demo

private static readonly System.Timers.Timer Timer = new System.Timers.Timer(); //初始化。
private static DateTime dtStar = new DateTime(); //时间段--开始时间。
private static DateTime dtEnd = new DateTime(); //时间段--结束时间。
private static int intervalTime = ;//间隔时间(分钟)。 /// <summary>
/// 程序入口(自行调用)
/// </summary>
/// <param name="timing">定时时间(格式:年月日时分秒)</param>
public void Init()
{
dtStar = DateTime.Now.Date.AddDays().AddHours();//今天11点。
dtEnd = DateTime.Now.Date.AddDays().AddHours();//今天17点。
intervalTime = ;//每1分钟执行一次。
SetInterval();
Timer.Elapsed += new System.Timers.ElapsedEventHandler((s, e) => SetInterval());
} /// <summary>
/// 定时器(间断)
/// </summary>
/// <param name="timing">起始时间</param>
private void SetInterval()
{
Timer.Stop();
var now = DateTime.Now;
if (now.Hour >= dtStar.Hour && now.Date == dtStar.Date)//达到开始时间,并且是今天
{
if (dtEnd.Subtract(now).TotalMinutes >= intervalTime)//小于结束时间
{
print(now);//打印
//----------------------------------------------------------
//此处可修改dtStar,dtEnd,intervalTime,三个参数。更改需求。
//----------------------------------------------------------
Timer.Interval = now.AddMinutes(intervalTime).Subtract(now).TotalMilliseconds;
Timer.Start();
}
else
{
//----------------------------------------------------------
//此处可修改dtStar,dtEnd,intervalTime,三个参数。更改需求。
//----------------------------------------------------------
dtStar = DateTime.Now.Date.AddDays().AddHours();//第二天11点。
dtEnd = DateTime.Now.Date.AddDays().AddHours();//第二天17点。
intervalTime = ;//每2分钟执行一次。
Timer.Interval = dtStar.Subtract(now).TotalMilliseconds;
Timer.Start();
}
}
else//如果 定时时间>当前时间
{
Timer.Interval = dtStar.Subtract(now).TotalMilliseconds;//重新计算定时时间,按毫秒计算。
Timer.Start();
}
} /// <summary>
/// 测试输出
/// </summary>
public void print(DateTime dt)
{
num++;
Console.WriteLine("执行第{0}次,时间:{1}", num, dt);
}

间断时间定时器

C# Timer 定时器的更多相关文章

  1. C#中WebService 的 Timer定时器过段时间后自动停止运行

    我用.net做的一个Timer定时器,定时获取短信并给予回复,但大概过了十几个小时以后,Timer定时器会自动停止,再发送短信就不能收到回复,需要在服务器中重新运行定时器才可以,请教各位! 我是在.n ...

  2. asp.net中Timer定时器在web中无刷新的使用

    最近在做一个项目的时候,web端的数据需要与数据源进行实时同步,并保证数据的准确性,当时,考虑到使用ajax异步刷新技术.但后来在网上查找相关资料时,发现这样做,太浪费资源了,因为ajax的提交请求不 ...

  3. JAVA Timer定时器使用方法(二)

    JAVA  Timer 定时器测试 MyTask.java:package com.timer; import java.text.SimpleDateFormat;import java.util. ...

  4. C#中Timer定时器的使用示例

    关于C#中timer类 在C#里关于定时器类就有3个: 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Tim ...

  5. [Python 多线程] Timer定时器/延迟执行、Event事件 (七)

    Timer继承子Thread类,是Thread的子类,也是线程类,具有线程的能力和特征.这个类用来定义多久执行一个函数. 它的实例是能够延迟执行目标函数的线程,在真正执行目标函数之前,都可以cance ...

  6. 浅析linux内核中timer定时器的生成和sofirq软中断调用流程(转自http://blog.chinaunix.net/uid-20564848-id-73480.html)

    浅析linux内核中timer定时器的生成和sofirq软中断调用流程 mod_timer添加的定时器timer在内核的软中断中发生调用,__run_timers会spin_lock_irq(& ...

  7. 浅析linux内核中timer定时器的生成和sofirq软中断调用流程【转】

    转自:http://blog.chinaunix.net/uid-20564848-id-73480.html 浅析linux内核中timer定时器的生成和sofirq软中断调用流程 mod_time ...

  8. .net中 Timer定时器

    作者:feiying008 在开发一套视觉系统时,发现系统内存一直不断增加,直至系统内存爆满.一开始还以为是程序内存泄露,是图像操作算法写的有问题,但是,发现如果电机轴如果 不运行的状态下,每隔一秒进 ...

  9. 关于C#中Timer定时器的重入问题解决方法(也适用于多线程)

    项目中用到了定时器随着服务启动作定时任务,按指定的准点时间定时执行相关操作,但是在指定准点时间内我只想让它执行一次,要避免重入问题的发生. 首先简单介绍一下timer,这里所说的timer是指的Sys ...

  10. JAVA Timer定时器使用方法

    JAVA  Timer 定时器测试 MyTask.java:package com.timer; import java.text.SimpleDateFormat;import java.util. ...

随机推荐

  1. (素材源代码)猫猫学IOS(四)UI之半小时搞定Tom猫

    下载地址:http://download.csdn.net/detail/u013357243/8514915 以下是执行图片展示 制作思路以及代码解析 猫猫学IOS(四)UI之半小时搞定Tom猫这里 ...

  2. java实现八种排序算法并测试速度

    速度测试: (1) 随机数范围:0-100希尔排序: => Time is 38600基数排序: => Time is 53300快速排序: => Time is 46500堆  排 ...

  3. Convolutional Neural Networks: Step by Step

    Andrew Ng deeplearning courese-4:Convolutional Neural Network Convolutional Neural Networks: Step by ...

  4. 4种事务的隔离级别,InnoDB怎样巧妙实现?

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/z50L2O08e2u4afToR9A/article/details/82186189 事务ACID ...

  5. HDu 2544 最短路【dijkstra &amp; floyed &amp; SPFA 】

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  6. EditText控件设置只读

    android的文本框输入控件(EditText),有时需要设置控件为只读,最简单的方法就是在layout xml文件中设置EditText的android:editable属性值为false即可,但 ...

  7. Spring4学习笔记一:环境搭建与插件安装、基本概念理解

    一:环境搭建 1:开发环境:JDK安装.Eclipse安装 2:数据库:Mysql.Sequel Pro(数据库可视化操作工具) 3:web服务器:Tomcat下载,并且把tomcat配置到Eclip ...

  8. Linux系统级日志系统

    linux日志系统,在不同的发行版本名字不同.本质一样都是对系统运行非正常状态的记录... rhel5.x    syslogrhel6.x    rsyslog service rsyslog st ...

  9. Swift 与 C 语言混合编程

    前言 作为一种可与 Objective-C 相互调用的语言,Swift 也具有一些与 C 语言的类型和特性,如果你的代码有需要,Swift 也提供了和常见的 C 代码结构混合编程的编程方式. 1.基本 ...

  10. [svc]sed&awk过滤行及sed常用例子

    - sed过滤行 sed '2p' sed '2,5p' sed '2p;3p;4p' - awk过滤行 awk 'NR==2' awk 'NR>=2 && NR <=3' ...