定时器是CS模式下经常会用到的组件,一般作为初学者(Me Too)都会直接从工具箱中拖一个TImer控件,然后在Timer_Tick中写自己的处理操作,我一开始也是这样使用定时器,后来才发现自己忽略了好多东西:首先,定时器分三种,而拖控件生成的TImer只是其中之一,下面简单介绍一下三种定时器的区别:
private void timer1_Tick(object sender, EventArgs e) { Console.WriteLine("----" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss.fff") + "----" ); }
这是定时器里面处理的操作,同时如果,界面上UI线程的操作比较耗时(就算不太耗时,依旧会影响定时器,只不过影响的不明显而已),如下所示:在按钮的触发操作中包含一个耗时的操作
private void button1_Click(object sender, EventArgs e) { string str = ""; for (int i = 0; i < 9000000; i++) { for (int j = 0; j < 20; j++) { str = i.ToString(); } } }
那么这个时候,启动程序,定时器开始每100毫秒输出当前时间,如果你再点击button1,你就会发现,控制台不再输出信息,等过几秒之后,才又开始输出,如下图:
private void timer1_Tick(object sender, EventArgs e) { Console.WriteLine("----" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss.fff") + "----"); string str = ""; for (int i = 0; i < 9000000; i++) { for (int j = 0; j < 5; j++) { str = i.ToString(); } } }
这样,在一个定时间隔为100毫秒的定时器里,进行了耗时的操作,最后导致界面卡死,而且,定时器的间隔也被拉长了,如下图所示:
原文:https://www.cnblogs.com/WangSong-Gemini/p/7251548.html