7.C# 三种Timer

简介:定时器一般用作「固定时间间隔」执行某个「任务」。

两种情况:

「固定时间间隔」执行某个「不耗时」任务

    例:1s 为间隔,执行一个耗时在 1s 内的任务。本篇不说明此种情况,这是大众都能理解的。

「固定时间间隔」执行某个「耗时」任务

    例:1s 为间隔,执行一个耗时超过 1s 的任务。如,定时取内存数据存入数据库。


接下来是 C# 中涉及的三种定时器,本篇主要想说明上面第二种情况,以 1s 为间隔,执行一个耗时2s 的任务

① System.Timers.Timer

使用 System.Timers.Timer会发现定时器并没有受「2s任务耗时」影响,依旧是1s执行一次

② System.Windows.Forms.Timer

使用 System.Windows.Forms.Timer  会发现定时器是2s执行一次

③ System.Threading.Timer

使用 System.Threading.Timer 会发现定时器也并没有受「2s任务耗时」影响,依旧是1s执行一次

当需要使用「System.Timers.Timer」和「System.Threading.Timer」按时间顺序定时执行某些耗时操作时,这里就会存在问题,当执行耗时操作过程中,定时器会多次触发,事实上这不是我们想看到的。下面一个小技巧解决这个问题。

第一个能想到是:加一把锁不就好了,代码如下

确实,这样做能够实现「按时间顺序定时执行某些耗时操作」,但存在一个问题,由于每秒都会出发定时器,所以会有大量「待执行」被阻塞在 lock (obj) 这里,这是划不来这种代码短时间内看出不出「厉害关系」,但长时间执行一定是一个大坑。

下面一个小技巧完美解决上边的问题:让被阻塞的线程直接返回

最终结果:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容