Timer 控件中的Elapsed事件与tick事件的区别

本文介绍了System.Timers.Timer的Elapsed事件和基于Windows的Timer控件的Tick事件的区别,强调Elapsed事件在不同线程中触发。文章通过实例展示了线程重入问题及其解决方案,包括使用lock、标志变量和Interlocked.Exchange。最后,总结了各种计时器在不同场景下的适用性。
摘要由CSDN通过智能技术生成

public System.Timers.Timer Timer1 = new System.Timers.Timer(); 
elsapsed事件是在另一个线程中引发的 。如果 elapsed事件中的代码是耗时的代码
当事件引发后,调用Timer1.Stop() 方法, 但elapsed 事件线程中的代码还在执行,直到该次elapse事件中的代码全执行完。

 

Timer 控件没有Elapsed事件吧,System.Timers类才有。

Visual Studio 和 .NET Framework 中包含三个计时器控件:

可添加到“工具箱”中的基于服务器的计时器

始终位于“工具箱”中的基于 Windows 的计时器

可通过编程方式使用的线程计时器

基于 Windows 的计时器针对在 Windows 窗体应用程序中使用而进行了优化。基于服务器的计时器是传统的计时器为了在服务器环境上运行而优化后的更新版本。线程计时器是一种简单的、轻量级计时器,它使用回调方法而不是使用事件,并由线程池线程提供支持。

在 Win32 体系结构中有两种类型的线程:UI 线程和辅助线程。UI 线程绝大多数时间处于空闲状态,等待消息循环中的消息到来。一旦接收到消息,它们就进行处理并等待下一个消息到来。另外,辅助线程用来执行后台处理而且不使用消息循环。Windows 计时器和基于服务器的计时器在运行时都使用 Interval 属性。线程计时器的时间间隔在 Timer 构造函数中设置。计时器的设计目的各不相同,它们的线程处理明确地指出了这一点: 

Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。Windows 计时器的精度限定为 55 毫秒。这些传统计时器要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。对于 COM 组件来说,这样会降低性能。 

基于服务器的计时器是为在多线程环境下与辅助线程一起使用而设计的。由于它们使用不同的体系结构,因此基于服务器的计时器可能比 Windows 计时器精确得多。服务器计时器可以在线程之间移动来处理引发的事件。 

对消息不在线程上发送的方案中,线程计时器是非常有用的。例如,基于 Windows 的计时器依赖于操作系统计时器的支持,如果不在线程上发送消息,与计时器相关的事件将不会发生。在这种情况下,线程计时器就非常有用。

Windows 计时器位于 System.Windows.Forms 命名空间中,服务器计时器 System.Timers 命名空间中,线程计时器位于 System.Threading 命名空间中。

 

 

 

首先简单介绍一下timer,这里所说的timer是指的System.Timers.timer,顾名思义,就是可以在指定的间隔是引发事件。官方介绍在这里,摘抄如下:

 

1
2
Timer 组件是基于服务器的计时器,它使您能够指定在应用程序中引发 Elapsed 事件的周期性间隔。然后可通过处理这个事件来提供常规处理。 例如,假设您有一台关键性服务器,必须每周 7 天、每天 24 小时都保持运行。 可以创建一个使用 Timer 的服务,以定期检查服务器并确保系统开启并在运行。 如果系统不响应,则该服务可以尝试重新启动服务器或通知管理员。
     基于服务器的 Timer 是为在多线程环境中用于辅助线程而设计的。 服务器计时器可以在线程间移动来处理引发的 Elapsed 事件,这样就可以比 Windows 计时器更精确地按时引发事件。

 

如果想了解跟其他的timer有啥区别,可以看这里,里面有详细的介绍,不再多说了(其实我也不知道还有这么多)。那使用这个计时器有啥好处呢?主要因为它是通过.NET Thread Pool实现的、轻量、计时精确、对应用程序及消息没有特别的要求。

★使用

 

下面就简单介绍一下,这个Timer是怎么使用的,其实很简单,我就采用微软提供的示例来进行测试,直接上代码了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//Timer不要声明成局部变量,否则会被GC回收
  private  static  System.Timers.Timer aTimer;
 
  public  static  void  Main()
  {
      //实例化Timer类,设置间隔时间为10000毫秒;
      aTimer =  new  System.Timers.Timer(10000);
 
      //注册计时器的事件
      aTimer.Elapsed +=  new  ElapsedEventHandler(OnTimedEvent);
 
      //设置时间间隔为2秒(2000毫秒),覆盖构造函数设置的间隔
      aTimer.Interval = 2000;
 
      //设置是执行一次(false)还是一直执行(true),默认为true
      aTimer.AutoReset =  true ;
 
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值