开发者,一文搞懂什么是 C 计时器!|CSDN 博文精选

时间:2019-07-21 来源:www.saisaisai.com

ROQvEHv7SYA9G2

作者|朱刚

主编|郭伟

定时器定时器通常用于C#开发,但是有很多开发人员不了解它。今天的文章将解释C#中的计时器。

C#中有3种常用的计时器:

System.Windows.Forms.Timer

System.Timers.Timer

System.Threading.Timer

RC6F7x6B7dmJLm

System.Windows.Forms.Timer

这个Timer是单线程的,这意味着只要它运行,其他线程就必须等待。

该Timer具有以下特征:

完全基于UI线程,当触发定时器时,操作系统将定时器消息插入到线程消息队列中,调用线程执行消息泵以提取消息,然后将其发送给回调方法Tick;

用启动和停止启动和停止定时器;

长UI操作可能导致Tick丢失;

您可以使用委托Hook Tick事件;

准确度不高;

通过将Enabled设置为True自动运行定时器。

从上面的第一个功能可以看出,此Timer将导致WinForm UI死亡,因此不建议为大量IO操作安排大量计算或任务。接下来,让我们看一个在IO操作的情况下体验暂停动画的示例。

我们在表单中放了两个按钮,一个Lable和一个Timer:

RVVHccOB9mEBYe

私有void Button_Click(对象发送者,EventArgs e)

{

timer.Interval=1000;

timer.Tick +=Timer_Tick;

timer.Start;

}

Private void Timer_Tick(object sender,EventArgs e)

{

对于(int i=0; i <10000; i ++)

{

File.AppendAllText(Directory.GetCurrentDirectory +'test.txt',i.ToString);

this.label_output.Text='当前操作:插入数字'+ i;

}

}

我们点击Calculate按钮,我们将看到WinForm有一个假死的动画(无法移动窗口,无法点击按钮等)。

RC6F8263HibLH0

System.Timers.Timer

Timer是基于服务器的,旨在用于多线程环境中的工作线程。它可以在线程之间移动以处理引发的Elapsed事件,这比前一个计时器更准确。

Timer具有以下功能:

处理事件由Elapsed设置返回,Elapsed在ThreadPool上运行;

按间隔设置间隔;

当AutoReset设置为False时,仅在达到第一个时间间隔后才会触发Elapsed事件;

是一个多线程计时器;

无法直接调用WinForm上的控件,需要使用delegate;

主要用于Windows服务。

再次,让我们看一下代码,看看Timer定时器的工作原理:

System.Timers.Timer timersTimer=new System.Timers.Timer;

私有void Button_Click(对象发送者,EventArgs e)

{

timersTimer.Interval=1000;

timersTimer.Enabled=true;

timersTimer.Elapsed +=TimersTimer_Elapsed;

timersTimer.Start;

}

Private void TimersTimer_Elapsed(object sender,System.Timers.ElapsedEventArgs e)

{

对于(int i=0; i <10000; i ++)

{

this.BeginInvoke(新动作(=&gt;

{

this.label_output.Text='当前时间:'+ DateTime.Now.ToString('yyyy-MM-dd HH: mm: ss');

}),);

}

}

私有void Button1_Click(对象发送者,EventArgs e)

{

timersTimer.Stop;

}

运行上面的代码,你会发现WinForm界面的假死已经消失了。

RTJXJ1kBqzfCnu

System.Threading.Timer

Timer也是一个多线程定时器,具有以下特征:

多线程;

与前两个计时器相比,没有Start和Stop方法。如果要停止计时器,必须调用Dispose方法来销毁Timer对象;

调用Dispose方法后,无法立即停止所有计时器。这是因为间隔小于多线程运行时的执行时间,并且多个线程不能同时停止;

是一个轻量级的计时器;

所有参数都在构造函数中设置;

您可以设置启动时间;

不建议在WinForm程序中使用。

我们来看看代码(在控制台应用程序中输入以下代码):

Static System.Threading.Timer threadingTimer;

静态int numSum=0;

静态void Main(string [] args)

{

threadingTimer=new System.Threading.Timer(new System.Threading.TimerCallback(threadingTimer_Elapsed), 0,1000);

Console.Read;

}

Private static void threadingTimer_Elapsed(object state)

{

对于(int i=0; i <10000; i ++)

{

numSum ++;

Console.WriteLine('输出编号:'+ i);

}

如果(numSum> 10000)

{

threadingTimer.Dispose;

Console.WriteLine( '结束');

}

}

请注意,当我们不再需要多线程Timer计时器时,我们可以调用Dispose方法来释放它占用的资源。但是因为Timer计时器被调度由线程池线程执行,所以在调用Dispose方法的重载之后可能会发生回调,因此我们可以使用Dispose(WaitHandle)方法等待所有返回。

RC6F8Ky5agOoen

总结

总之,我们总结了C#中不同Timer定时器的特性和使用环境:

RVVHccgFa0QcX

作者:朱钢,NET高级开发工程师,7年一线开发经验,参与了电子政务系统和人工智能客户服务系统的开发,以及互联网招聘网站架构,目前在北京工作,张恒辉科技发展有限公司

R69FpRH4d90a7d