定时器
System.Timers.Timer是在.NET的Thread Pool上面运行的,而不是直接在UI Thread上面运行,所以在这种Timer的EventHandler里面进行耗时较长的计算不会导致UI失去响应。
调用 timer.Start()或者timer.Enabled = true来启动它, timer.Start()的内部原理还是设置timer.Enabled = true;
调用 timer.Stop()或者timer.Enabled = false来停止引发Elapsed事件, timer.Stop()的内部原理还是设置timer.Enabled = false,最重要的是timer.Enabled = false后会取消线程池中当前等待队列中剩余任务的执行。
当 AutoReset设置为false时,Timer只在第一个Interval过后引发一次Elapsed事件。若要保持以Interval时间间隔引发 Elapsed 事件,请将AutoReset设置为true。
Elapsed事件在ThreadPool线程上引发。如果Elapsed事件的处理时间比Interval长,在另一个hreadPool线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。
避免还没执行完,间隔时间到,开始执行下一次。
((System.Timers.Timer)sender).Enabled = false;
Console.WriteLine("TestTimer_Elapsed");
((System.Timers.Timer)sender).Enabled = true;
开启后等待间隔时间到,才执行,不是立即执行。
System.Timers.Timer testTimer = new System.Timers.Timer(); private void Form1_Load(object sender, EventArgs e) { testTimer.Interval = 5000; testTimer.Enabled = false; testTimer.Elapsed += new System.Timers.ElapsedEventHandler(TestTimer_Elapsed); testTimer.AutoReset = true;//设置为自动调用 } private void TestTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { ((System.Timers.Timer)sender).Enabled = false; Console.WriteLine("TestTimer_Elapsed"); ((System.Timers.Timer)sender).Enabled = true; } private void btnStart_Click(object sender, EventArgs e) { Console.WriteLine("btnStart_Click"); testTimer.Enabled = true; } private void btnStop_Click(object sender, EventArgs e) { Console.WriteLine("btnStop_Click"); testTimer.Enabled = false; }
看门狗:用来监测某一个方法是否在运行。
System.Timers.Timer WatchDogTimer = new System.Timers.Timer();
private void Form1_Load(object sender, EventArgs e)
{
WatchDogTimer.Interval = 3000;
WatchDogTimer.Elapsed += new System.Timers.ElapsedEventHandler(WatchDogTimer_Elapsed);
WatchDogTimer.Enabled = true;
runDateTime= DateTime.Now;
}
private void WatchDogTimer_Elapsed(object sender, ElapsedEventArgs e)
{
TimeSpan ts = DateTime.Now - runDateTime;
if((ts.Minutes * 60 + ts.Seconds)>= 3)
{
ShowLog("msg");
}
}
DateTime runDateTime;
private void button1_Click(object sender, EventArgs e)
{
//喂狗
runDateTime = DateTime.Now;
}