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. 版本控制-git(二)

    上次文章给大家介绍了Git的一些基本知识(http://www.cnblogs.com/jerehedu/p/4582398.html),并介绍了使用git init初始化化版本库,使用git add ...

  2. Android典型界面设计(3)——访网易新闻实现双导航tab切换

    一.问题描述 双导航tab切换(底部区块+区域内头部导航),实现方案底部区域使用FragmentTabHost+Fragment, 区域内头部导航使用ViewPager+Fragment,可在之前博客 ...

  3. 五花八门的Shell 的相关概念和配置方法

    使用Linux的过程中少不了使用各种各样的Shell, 而根据启动环境的不同,Shell会读取不同的配置文件. 本文便来详细介绍这些不同名字的配置文件在何时会被Shell读取. 什么是 Shell S ...

  4. Spark:实现行转列

    示例JAVA代码: import static org.apache.spark.sql.functions.col; import static org.apache.spark.sql.funct ...

  5. android学习笔记(8)linearlayout与android:layout_weight学习

    一,linearlayout 线性布局,布局文件里设置多个linearlayout来达到总体线性布局的风格. android:gravity="right"对齐方式,居右对齐,gr ...

  6. linux网络设备—mdio总线

    一.结构体 struct mii_bus { const char *name; //总线名 char id[MII_BUS_ID_SIZE]; //id void *priv; //私有数据 int ...

  7. maven本地仓库中存在jar包,但编译不成功,显示jar包不存在

    介绍一下背景,项目要迁移进坑人的离线的内网开发,将在同事那编译通过的代码和maven仓库拷进内网,打算编译通过之后再上传私服,结果配好maven之后,本地库中的部分jar包显示没有引入,如下面的波浪线 ...

  8. 编程调节Win7/Win8系统音量的一种方法

    不得不说, 自Win7(好像是吧), Windows的音量调节功能比以前更人性化了....      但编程接口却变得更加复杂了............. 还要用到IAudioEndpointVolu ...

  9. HTML5中的History对象

    HTML5标准之前 基本操作 1.forward(number) 加载histroy列表中的下一个URL 2.back(number) 加载histroy列表中的上一个URL 3.go(number) ...

  10. 2018年末--积极拥抱h5.转载 大前端时代来临,我们何去何从?

    1.大前端时代是什么? 大前端时代是WEB统一的时代,利用html5或者6甚至7,不但可以开发传统的网站,做炫酷的网页动态效果,更可以采用BS架构应用程序.开发手机端web应用.移动端Native应用 ...