一、代码
class Program
{
static void Main(string[] args)
{
// 5s触发定时器Timer_Elapsed
System.Timers.Timer timer = new System.Timers.Timer();
timer.AutoReset = false;
timer.Interval = 5000;
timer.Elapsed += Timer_Elapsed;
timer.Enabled = true;
int i = 0;
int count = 10;
// 过1s Start一次 最后触发Timer_Elapsed的是第一次的Start 还是最后一次的Start?
while (count > 0)
{
i++;
count--;
Thread.Sleep(1000);
timer.Start();
Console.WriteLine($"{i}:{DateTime.Now.Ticks}");
}
Thread.Sleep(20000);
}
private static void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Console.WriteLine($"{DateTime.Now.Ticks}");
}
}
二、结果
从结果可以看出,中途触发了三次的不带i的打印输出,而不是一次不带i的打印输出。证明触发Timer_Elapsed的是第一次Start,而不是最后一次。
三、源码
Start函数
Enable赋值
四、反思
为了防止计时器疯狂Start后触发的是第一次Start的timer_elapse,而不是最后一次Start的timer_elapse,应该在每次Start前先Stop。