C#的timer类
在C#里关于定时器类就有3个 
1.定义在System.Windows.Forms里 
2.定义在System.Threading.Timer类里 
3.定义在System.Timers.Timer类里 
System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API SetTimer实现的。它的主要缺点是计时不精确,而且必须有消息循环,Console Application(控制台应用程序)无法使用。
System.Timers.Timer和System.Threading.Timer非常类似,它们是通过.NET Thread Pool实现的,轻量,计时精确,对应用程序、消息没有特别的要求。System.Timers.Timer还可以应用于WinForm,完全取代上面的Timer控件。它们的缺点是不支持直接的拖放,需要手工编码。 
例: 
使用System.Timers.Timer类 
System.Timers.Timer t = new System.Timers.Timer(1000);//实例化Timer类,设置间隔时间为10000毫秒;
//或者是实例化时不传递参数.通过   myTimer.Interval=1000;   来设置间隔时间;
t.Elapsed += new System.Timers.ElapsedEventHandler(theout);//到达时间的时候执行事件; 
t.AutoReset = true;//设置是执行一次(false)还是一直执行(true); 
t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件; 
public void theout(object source, System.Timers.ElapsedEventArgs e) 
{ 
MessageBox.Show( "OK! "); 
}
关于定时器 
定时器是个很有意思的东西,它很有用,但我认为这不是现代计算机的结构所擅长的事情。 
计算机适合做那些很大量的简单重复工作,或者根据请求做出回应。 
DOS时代是没有进程线程等概念的,那时候要想做到定时真是有些麻烦 
通常的做法是死循环不断监测时间,发现时间到了就做特定的事情 
当然你可以用delay,来指定等待多长时间,但是如果你一边要响应用户的操作,比如输入,一边要定时做些 
事情就是一件麻烦的事了 
当然有些人可以这样做,截取系统的时钟中断(我忘了中断号是多少了),每秒钟有18.2次 
当这些做法都不是很优雅。但DOS时代只能这样凑合着了 
Windows是个伟大的进步,系统提供了Timer支持,但是问题是这个定时器并不准时而且有时候根本不能用。 
Win32 API中有个SetTimer函数,可以为一个窗口创建一个定时器,这个定时器会定时产生消息WM_TIMER也可以调用 
指定的回调函数,其实这都是一样的,因为都是单线程的。 
单线程的定时器会有很多问题,首先是不准时,定时器只是定时把消息WM_TIMER访到线程的消息队列里,但是并不保证消息会立刻被响应,如果 
碰巧系统比较忙,那么消息可能会在队列里放一端时间才被响应,还会造成本来应该间隔一段时间发生的消息响应连续发生了 
解决方法通常是 
OnTimer(...) 
{ 
//Timer process.....
MSG msg; 
While(PeekMessage(&msg, m_hWnd, WM_TIMER, WM_TIMER, PM_REMOVE)); 
} 
在当前Timer处理中,把消息队列里的WM_TIMER消息,清除掉。 
更糟的是如果你不去调用GetMessage,那么就不会有Timer发生了。 
这个问题直到win xp都没什么改变,似乎微软并不打算在Win32 API中解决这个问题了。 
.NET Framework为我们带来了新的解决方案 
.NET Framework提供三种Timer 
Server Timers System.Timers.Timer 
Thread Timers System.Threading.Timer 
Windows Timers System.Windows.Forms.Timer 
其中Windows Timers只是提供了和WinAPI 一样的Timer,仍然是基于消息,仍然是单线程 
其它两个就不同了,他们是基于线程池的Thread Pool,这样最大的好处在于,产生的时间间隔准确均匀。 
Server Timers 和 Thread Timers 的不同在于ServerTimers 是基于事件的,Thread Timers是基于回调函数, 比较轻量级方便易用。 
但是这样的Timer也有问题,就是由于时多线程定时器,就会出现如果一个Timer处理没有完成,到了时间下一个 
照样会发生,这就会导致重入问题 
对付重入问题通常的办法是加锁,但是对于 Timer却不能简单的这样做,你需要评估一下 
首先Timer处理里本来就不应该做太需要时间的事情,或者花费时间无法估计的事情,比同远方的服务器建立一个网络连接,这样的做法尽量避免 
如果实在无法避免,那么要评估Timer处理超时是否经常发生,如果是很少出现,那么可以用lock(Object)的方法来防止重入 
如果这种情况经常出现呢?那就要用另外的方法来防止重入了 
我们可以设置一个标志,表示一个Timer处理正在执行,下一个Timer发生的时候发现上一个没有执行完就放弃执行 
static int inTimer = 0; 
public static void threadTimerCallback(Object obj) 
{ 
if ( inTiemr == 0 ) 
{ 
inTimer = 1; 
Console.WriteLine( "Time:{0}, \tThread ID:{1} ", DateTime.Now, Thread.CurrentThread.GetHashCode()); 
Thread.Sleep(2000); 
inTimer = 0; 
} 
} 
但是在多线程下给inTimer赋值不够安全,还好Interlocked.Exchange提供了一种轻量级的线程安全的给对象赋值的方法 
static int inTimer = 0; 
public static void threadTimerCallback(Object obj) 
{ 
if ( Interlocked.Exchange(ref inTimer, 1) == 0 ) 
{ 
Console.WriteLine( "Time:{0}, \tThread ID:{1} ", DateTime.Now, Thread.CurrentThread.GetHashCode()); 
Thread.Sleep(250); 
Interlocked.Exchange(ref inTimer, 0); 
} 
}
正确的选择使用.NET中的三个Timer 
Timer这个类在.NET的类库中有三个:
1)System.Threading.Timer
是一个使用回调方法的计时器,而且由线程池线程服务,简单且对资源要求不高。
2)System.Windows.Forms.Timer
这是一个必须和Windows窗体一起使用的Timer。
3)System.Timers.Timer
基于服务器计时器功能的Timer,根据服务器系统时间进行运行的Timer。如果需要写Windows Services的话可以使用这个Timer来进行一
些需要在一定间隔时间进行某项操作的环境下使用。 
它使您能够指定在应用程序中引发 Elapsed 事件的周期性间隔。然后可以操控此事件以提供定期处理。例如,假设您有一台关键性服务
器,必须每周 7 天、每天 24 小时都保持运行。可以创建一个使用 Timer 的服务,以定期检查服务器并确保系统开启并在运行。如果系统不
响应,则该服务可以尝试重新启动服务器或通知管理员。基于服务器的 Timer 是为在多线程环境中用于辅助线程而设计的。服务器计时器可
以在线程间移动来处理引发的 Elapsed 事件,这样就可以比 Windows 计时器更精确地按时引发事件。
C#的timer类的更多相关文章
- 本地数据Store。Cookie,Session,Cache的理解。Timer类主要用于定时性、周期性任务 的触发。刷新Store,Panel
		
本地数据Store var monthStore = Ext.create('Ext.data.Store', { storeId : 'monthStore', autoLoad : false, ...
 - C#中timer类的用法
		
C#中timer类的用法 关于C#中timer类 在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类 ...
 - Timer类和TimerTask类
		
Timer类是一种线程设施,可以用来实现在某一个时间或某一段时间后安排某一个任务执行一次或定期重复执行. 该功能要与TimerTask类配合使用.TimerTask类用来实现由Timer安排的一次或重 ...
 - 使用Timer类的两个实例 动态时钟
		
package chapter16; import javax.swing.*; import chapter15.StillClock; import java.awt.event.*; publi ...
 - 使用System.Timers.Timer类实现程序定时执行
		
使用System.Timers.Timer类实现程序定时执行 在C#里关于定时器类有3个:System.Windows.Forms.Timer类.System.Threading.Timer类和Sys ...
 - 关于C#中timer类
		
·关于C#中timer类 在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Tim ...
 - [ImportNew]Java中的Timer类和TimerTask类
		
http://www.importnew.com/9978.html java.util.Timer是一个实用工具类,该类用来调度一个线程,使它可以在将来某一时刻执行. Java的Timer类可以调度 ...
 - Java:利用java Timer类实现定时执行任务的功能
		
一.概述 在java中实现定时执行任务的功能,主要用到两个类,Timer和TimerTask类.其中Timer是用来在一个后台线程按指定的计划来执行指定的任务.TimerTask一个抽象类,它的子类代 ...
 - 【外文翻译】使用Timer类去调度任务 ——java
		
使用Timer类去调度任务 --java 原文地址:https://dzone.com/articles/using-timer-class-to-schedule-tasks 原文作者:Jay Sr ...
 
随机推荐
- wwdc2016-session707 Notifications(draft)
			
Introduction to Notificationshttps://developer.apple.com/wwdc2016/707 通知这哥们说话有点不清晰啊. 远程通知本地通知 可以被操作的 ...
 - MT写的对URL操作的两个方法
			
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - Digg Reader 登录不了,原来如此
			
cdnjs.cloudflare.com 不能访问,你懂的,给 https://cdnjs.cloudflare.com 跟 http://cdnjs.cloudflare.com 架个梯子就可以了, ...
 - jQuery - jQuery的$.extend和$.fn.extend作用及区别
			
jQuery为开发插件提拱了两个方法,分别是: 1. jQuery.fn.extend(); 2. jQuery.extend(); 虽然 javascript没有明确的类的概念,但是可以构建类似类的 ...
 - ubuntu 安装node.js + express + mongodb
			
转载自http://my.oschina.net/reg/blog/289536 Ctrl + Alt + T,打开终端,输入以下命令安装: sudo apt-get install nodejs 安 ...
 - 十八、【开源】EnterpriseFrameWork框架核心类库之Winform控制器
			
回<[开源]EnterpriseFrameWork框架系列文章索引> EFW框架源代码下载:http://pan.baidu.com/s/1qWJjo3U EFW框架中的WinContro ...
 - php ioc and web rest design
			
三个核心文件 1.公开访问web service配置 config.php 2.管理BEAN,扫描,注册,初始化等流程 ioc.php 3.管理 rest 拦载处理 ws.php config.php ...
 - MySQL Cluster 集群
			
本文转载 http://www.cnblogs.com/gomysql/p/3664783.html MySQL Cluster是一个基于NDB Cluster存储引擎的完整的分布式数据库系统.不仅仅 ...
 - MyBatis知多少(8)关系型数据库
			
MyBatis的存在就是为了简化对关系数据库的访问.数据库的确非常复杂,要正确地使用它们需要做很多的工作.数据库负责管理数据和修改数据.我们使用数据库而不简简单单地使用一个 平板文件的原因就在于数据库 ...
 - Linux高级编程--05.文件读写
			
缓冲I/O和非缓冲I/O 文件读写主要牵涉到了如下五个操作:打开.关闭.读.写.定位.在Linux系统中,提供了两套API, 一套是C标准API:fopen.fclose.fread.fwrite.f ...