C# Timer 定时器
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 定时器的更多相关文章
- C#中WebService 的 Timer定时器过段时间后自动停止运行
我用.net做的一个Timer定时器,定时获取短信并给予回复,但大概过了十几个小时以后,Timer定时器会自动停止,再发送短信就不能收到回复,需要在服务器中重新运行定时器才可以,请教各位! 我是在.n ...
- asp.net中Timer定时器在web中无刷新的使用
最近在做一个项目的时候,web端的数据需要与数据源进行实时同步,并保证数据的准确性,当时,考虑到使用ajax异步刷新技术.但后来在网上查找相关资料时,发现这样做,太浪费资源了,因为ajax的提交请求不 ...
- JAVA Timer定时器使用方法(二)
JAVA Timer 定时器测试 MyTask.java:package com.timer; import java.text.SimpleDateFormat;import java.util. ...
- C#中Timer定时器的使用示例
关于C#中timer类 在C#里关于定时器类就有3个: 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Tim ...
- [Python 多线程] Timer定时器/延迟执行、Event事件 (七)
Timer继承子Thread类,是Thread的子类,也是线程类,具有线程的能力和特征.这个类用来定义多久执行一个函数. 它的实例是能够延迟执行目标函数的线程,在真正执行目标函数之前,都可以cance ...
- 浅析linux内核中timer定时器的生成和sofirq软中断调用流程(转自http://blog.chinaunix.net/uid-20564848-id-73480.html)
浅析linux内核中timer定时器的生成和sofirq软中断调用流程 mod_timer添加的定时器timer在内核的软中断中发生调用,__run_timers会spin_lock_irq(& ...
- 浅析linux内核中timer定时器的生成和sofirq软中断调用流程【转】
转自:http://blog.chinaunix.net/uid-20564848-id-73480.html 浅析linux内核中timer定时器的生成和sofirq软中断调用流程 mod_time ...
- .net中 Timer定时器
作者:feiying008 在开发一套视觉系统时,发现系统内存一直不断增加,直至系统内存爆满.一开始还以为是程序内存泄露,是图像操作算法写的有问题,但是,发现如果电机轴如果 不运行的状态下,每隔一秒进 ...
- 关于C#中Timer定时器的重入问题解决方法(也适用于多线程)
项目中用到了定时器随着服务启动作定时任务,按指定的准点时间定时执行相关操作,但是在指定准点时间内我只想让它执行一次,要避免重入问题的发生. 首先简单介绍一下timer,这里所说的timer是指的Sys ...
- JAVA Timer定时器使用方法
JAVA Timer 定时器测试 MyTask.java:package com.timer; import java.text.SimpleDateFormat;import java.util. ...
随机推荐
- 版本控制-git(二)
上次文章给大家介绍了Git的一些基本知识(http://www.cnblogs.com/jerehedu/p/4582398.html),并介绍了使用git init初始化化版本库,使用git add ...
- Android典型界面设计(3)——访网易新闻实现双导航tab切换
一.问题描述 双导航tab切换(底部区块+区域内头部导航),实现方案底部区域使用FragmentTabHost+Fragment, 区域内头部导航使用ViewPager+Fragment,可在之前博客 ...
- 五花八门的Shell 的相关概念和配置方法
使用Linux的过程中少不了使用各种各样的Shell, 而根据启动环境的不同,Shell会读取不同的配置文件. 本文便来详细介绍这些不同名字的配置文件在何时会被Shell读取. 什么是 Shell S ...
- Spark:实现行转列
示例JAVA代码: import static org.apache.spark.sql.functions.col; import static org.apache.spark.sql.funct ...
- android学习笔记(8)linearlayout与android:layout_weight学习
一,linearlayout 线性布局,布局文件里设置多个linearlayout来达到总体线性布局的风格. android:gravity="right"对齐方式,居右对齐,gr ...
- linux网络设备—mdio总线
一.结构体 struct mii_bus { const char *name; //总线名 char id[MII_BUS_ID_SIZE]; //id void *priv; //私有数据 int ...
- maven本地仓库中存在jar包,但编译不成功,显示jar包不存在
介绍一下背景,项目要迁移进坑人的离线的内网开发,将在同事那编译通过的代码和maven仓库拷进内网,打算编译通过之后再上传私服,结果配好maven之后,本地库中的部分jar包显示没有引入,如下面的波浪线 ...
- 编程调节Win7/Win8系统音量的一种方法
不得不说, 自Win7(好像是吧), Windows的音量调节功能比以前更人性化了.... 但编程接口却变得更加复杂了............. 还要用到IAudioEndpointVolu ...
- HTML5中的History对象
HTML5标准之前 基本操作 1.forward(number) 加载histroy列表中的下一个URL 2.back(number) 加载histroy列表中的上一个URL 3.go(number) ...
- 2018年末--积极拥抱h5.转载 大前端时代来临,我们何去何从?
1.大前端时代是什么? 大前端时代是WEB统一的时代,利用html5或者6甚至7,不但可以开发传统的网站,做炫酷的网页动态效果,更可以采用BS架构应用程序.开发手机端web应用.移动端Native应用 ...