一、代码
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。


文章探讨了一个C#程序中关于System.Timers.Timer的使用问题。代码示例显示,即使在短时间内多次调用Start,最终触发Timer_Elapsed的事件是第一次Start时设置的。为了避免这种不确定性,作者建议在每次启动定时器前先停止它,以确保触发的是预期的事件。
1534

被折叠的 条评论
为什么被折叠?



