C#中种常用的计时器

时间:2021-03-22 21:35:50

1、System.Timers.Timer和System.Windows.Forms.Timer,它的最低识别为1/18s。

2、timeGetTime,他的最低识别能达到5ms。

3、System.Environment.TickCount,它最低识别为毫秒级。

4、QueryPerformanceCounter,它最低识别为1ms。

System.Timers.Timer

System.Object 
  System.MarshalByRefObject
    System.ComponentModel.Component
      System.Timers.Timer

在应用程序中生成定期事件。

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

基于服务器的 Timer 是为在多线程环境中用于辅助线程而设计的。 服务器计时器可以在线程间移动来处理引发的 Elapsed 事件,这样就可以比 Windows 计时器更精确地按时引发事件。

基于 Interval 属性的值,Timer 组件引发 Elapsed 事件。 您可以处理这个事件来执行必要的处理。 例如,假设您有一个联机销售应用程序,它持续向一个数据库投递销售订单。 编译要传送的指令的服务成批处理订单,而不是单独地处理每份订单。 可以使用 Timer 每 30 分钟启动一次批处理。

注意

当 AutoReset 设置为 false 时,Timer 只在第一个 Interval 过后引发一次 Elapsed事件。 若要保持以 Interval 时间间隔引发 Elapsed 事件,请将 AutoReset 设置为 true。

在 .NET Framework 2.0 版及更早版本中,Timer 组件捕获 Elapsed 事件的事件处理程序所引发的所有异常并禁止显示这些异常。 在将来的 .NET Framework 版本中,此行为可能会有更改。

如果 SynchronizingObject 属性为 null,则在 ThreadPool 线程上引发 Elapsed 事件。 如果 Elapsed 事件的处理时间比 Interval 长,在另一个 ThreadPool 线程上将会再次引发此事件。 在这种情况下,事件处理程序应当是可重入的。

注意

在一个线程调用 Stop 方法或将 Enabled 属性设置为 false 的同时,可在另一个线程上运行事件处理方法。 这可能导致在计时器停止之后引发 Elapsed 事件。 Stop 方法的代码示例演示了一种避免此争用条件的方法。

即使 SynchronizingObject 不是 null,Elapsed 在 Dispose 或 Stop 方法调用后或Enabled 属性设置为 false 后,事件可以发生,这是因为引出 Elapsed 事件的信号总是排队等待执行线程池线程。 解决此争用条件的一种方法是:设置一个标志,通知Elapsed 事件的事件处理程序忽略随后的事件。

如果您使用 Timer 与用户界面元素如窗体或控件,没有放置计时器的该用户界面元素,指定包含 Timer 窗体或控件到 SynchronizingObject 属性,以使该事件封送到用户界面线程。

Timer 在运行时是不可见的。

有关 Timer 的实例的初始属性值列表,请参见 Timer 构造函数。

注意

应用到此类型或成员的 HostProtectionAttribute 特性具有以下 Resources 属性值:Synchronization | ExternalThreadingHostProtectionAttribute 不影响桌面应用程序(桌面应用程序一般通过双击图标、键入命令或在浏览器中输入 URL 启动)。有关更多信息,请参见 HostProtectionAttribute 类或 SQL Server 编程和宿主保护特性

例子Timer1

System.Windows.Forms.Timer

System.Object 
  System.MarshalByRefObject
    System.ComponentModel.Component
      System.Windows.Forms.Timer

Timer 用于以用户定义的事件间隔触发事件。 Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。 它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。

使用此计时器时,请使用 Tick 事件执行轮询操作,或在指定的时间内显示启动画面。 每当 Enabled 属性设置为 true 且 Interval 属性大于 0 时,将引发 Tick 事件,引发的时间间隔基于 Interval 属性设置。

此类提供用于设置时间间隔以及启动和停止计时器的方法。

注意

Windows 窗体 Timer 组件是单线程组件,精度限定为 55 毫秒。 如果您需要更高精度的多线程计时器,请使用 System.Timers 命名空间中的 Timer 类。

例子Timer2

后面的适用于计时

QueryPerformanceCounter  &

timeGetTime  &

System.Environment.TickCount

最高分辨率计时器

可用于查明代码性能瓶颈。

启动值: 3516284.3498
结束值: 3516284.3521
QueryPerformanceCounter 最小分辨率: 1/1193182 秒
API 开销: 1.92761875388667E-05 秒

GetTickCount 最小分辨率: 10 ms
timeGetTime 最小分辨率: 10 ms