美文网首页C#随记
7.C# 三种Timer

7.C# 三种Timer

作者: 小王子是偷影子的人 | 来源:发表于2018-08-19 22:52 被阅读0次

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

两种情况:

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

    例: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) 这里,这是划不来这种代码短时间内看出不出「厉害关系」,但长时间执行一定是一个大坑。

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

最终结果:

相关文章

网友评论

    本文标题:7.C# 三种Timer

    本文链接:https://www.haomeiwen.com/subject/umjhiftx.html