.NET Framework提供三种Timer介绍,如何让你的上位机软件定时更精确。

.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是基于回调函数
我更喜欢Thread Timer,比较轻量级方便易用。
但是这样的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 计时器更精确地按时引发事件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值