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. ...
随机推荐
- Linux下 $(cd `dirname $0`;pwd)
在命令行状态下单纯执行 $ cd `dirname $0` 是毫无意义的.因为他返回当前路径的".".这个命令写在脚本文件里才有作用,他返回这个脚本文件放置的目录,并可以根据这个目 ...
- 免费网络视频监控软件cmsclient
http://www.brickcom.com/products/DetailView.php?modelname=CMS-Client&series=CMS#product-support ...
- TinyMCE与Domino集成
TinyMCE与Domino集成 一:TinyMCE简介 TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,由JavaScript写成.它对IE6+和Firefox1.5+都有着非常良好的支持 ...
- 【转】苹果App Store审核指南中文翻译(更新)
(注:<苹果应用商店审核指南>中文翻译最近一次更新为2013-03-04,文中红色部分是相对于2013-03-04版本的新增内容,绿色部分代表更改的内容,蓝色表示苹果相关官方文档的链接.) ...
- codeblocks技巧收集
Ctrl+Shift+C 注释代码块 Ctrl+Shift+X 取消注释
- xcode 报错 malloc: *** error for object 0x6c3c5a4: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug------d
大家有时候会遇到这个错误 malloc: *** error for object 0x******: incorrect checksum for freed object - object was ...
- android 显示gif图片
在android中不支持gif格式的图片,但是由于我希望在我的程序中刚刚加载的时候有一个小人在跑步表示正在加载.而这个小人跑就是一个gif图片.也就是希望程序一启动时就加载gif图片.在网上查找了一些 ...
- 基础006_pg109_IP-Xfft
作者:桂. 时间:2018-05-09 07:20:48 链接:http://www.cnblogs.com/xingshansi/p/9012232.html 前言 简要记录xilinx FFT的 ...
- MySQL 清除从库同步信息
实际的业务生产系统中,mysql从库有时候会根据实际需求变更为主库,这时候我们需要清除掉从库配置的主从信息登录从库执行以下命令:mysql> stop slave;mysql> reset ...
- Socket网络编程--简单Web服务器(4)
上一小节已经实现了对图片的传输,接下来就是判断文件是否为js,css,png等格式.我们增加一个函数用于判断格式 int WebServer::get_filetype(char *type,char ...