0
点赞
收藏
分享

微信扫一扫

C#中种常用的计时器

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 | ExternalThreading。​​HostProtectionAttribute​​​不影响桌面应用程序(桌面应用程序一般通过双击图标、键入命令或在浏览器中输入 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

龙腾一族至尊龙骑



举报

相关推荐

0 条评论