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. ...
随机推荐
- NSArray与NSString、NSData,NSDictionary与NSString、NSData 相互转化
NSArray *array = @[ @1, @2, @3, @4, @5, @3 ]; // 1. NSArray与NSData相互转化 // NSArray to NSData NSError ...
- Java中的语法糖
一.范型 1. C#和Java范型的区别 在C#中范型是切实存在的,List<int>和List<String>就是两种不同的类型,它们在系统运行期间生成,有自己的虚方法表和类 ...
- Android性能优化-减小APK大小
前言 用户通常会避免下载比较大的应用,特别是连接到2G和3G网络,或者按流量收费的设备.这篇文章描述了如何减小apk的大小,帮助你让更多的用户下载你的app. 一 理解APK的结构 在讨论如何减小ap ...
- ionic tab显示到顶部去了
添加配置调整显示位置 .config(function($stateProvider, $urlRouterProvider,$ionicConfigProvider) { $ionicConfigP ...
- 【PMP】合同类型
合同类型与适用场景 图形解读: 总价类 (1)固定总价类合同:货物的采购价格在一开始就已确定,并且不允许改变(除非工作范围发生变更) (2)总价加激励费合同:同会设置价格上限,高于此价格的上限的全部成 ...
- Git tag 标签操作
列表 # 列出已有的标签 $ git tag # 为了能及时看到远程上新增的标签, 在上面的命令之前可以fetch一下 git fetch --all --tags --prune # 列出匹配的部分 ...
- Django TemplateDoesNotExist
在联系Django的时候,启动正常,我在浏览器上输入URL地址后报错 TemplateDoesNotExist at /test/ 解决方案 默认这里是空的,这里我们填上我们静态文件的地址
- MemoryFile偷取安卓内存
参考链接:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0111/3859.html MemoryFile memoryFile ...
- android的左右滑动效果实现-ViewFlipper
说到android的左右滑动效果我们可以说是在每个应用上面都可以看到这样的效果,不管是微博,还是QQ等.实现左右滑动的方式很多,有ViewPaer(不过这个和需要android-support-v4. ...
- 【emWin】例程二十六:窗口对象——Listbox
简介: 列表框用于选择列表的一个元素.创建的列表框可以没有环绕的框架窗口,或者作为 FRAMEWIN 小工具的子窗口建立列表框中的项目被选定后,会突出显示. 触摸校准(上电可选择是否进入校准界面) 示 ...