简介:定时器一般用作「固定时间间隔」执行某个「任务」。
两种情况:
「固定时间间隔」执行某个「不耗时」任务
例:1s 为间隔,执行一个耗时在 1s 内的任务。本篇不说明此种情况,这是大众都能理解的。
「固定时间间隔」执行某个「耗时」任务
例:1s 为间隔,执行一个耗时超过 1s 的任务。如,定时取内存数据存入数据库。
接下来是 C# 中涉及的三种定时器,本篇主要想说明上面第二种情况,以 1s 为间隔,执行一个耗时2s 的任务
① System.Timers.Timer
![](https://img.haomeiwen.com/i7534117/76abc8adcb4672d1.png)
![](https://img.haomeiwen.com/i7534117/8eccfefcd6ae8ed6.png)
② System.Windows.Forms.Timer
![](https://img.haomeiwen.com/i7534117/106e5c0a1d9e60d9.png)
![](https://img.haomeiwen.com/i7534117/02b06f1a847cd63a.png)
③ System.Threading.Timer
![](https://img.haomeiwen.com/i7534117/526714e91eaeec31.png)
![](https://img.haomeiwen.com/i7534117/f412247f71be6dc7.png)
当需要使用「System.Timers.Timer」和「System.Threading.Timer」按时间顺序定时执行某些耗时操作时,这里就会存在问题,当执行耗时操作过程中,定时器会多次触发,事实上这不是我们想看到的。下面一个小技巧解决这个问题。
第一个能想到是:加一把锁不就好了,代码如下
![](https://img.haomeiwen.com/i7534117/0656693acf30575a.png)
确实,这样做能够实现「按时间顺序定时执行某些耗时操作」,但存在一个问题,由于每秒都会出发定时器,所以会有大量「待执行」被阻塞在 lock (obj) 这里,这是划不来这种代码短时间内看出不出「厉害关系」,但长时间执行一定是一个大坑。
下面一个小技巧完美解决上边的问题:让被阻塞的线程直接返回
![](https://img.haomeiwen.com/i7534117/c9e7bc5d6182cd85.png)
最终结果:
![](https://img.haomeiwen.com/i7534117/49061cb16ca21d74.png)
网友评论