NET中的三种Timer的区别和用法

 我来答
深圳市关键词教育培训中心
2017-01-18 · 学英语,上关键词教育
深圳市关键词教育培训中心
关键词教育于2007年在英国成立,长年致力于英语培训、海外游学等多种国际教育项目。2010年进驻中国后,关键词青少儿英语逐渐成为中国使用朗文教材体系最成功的,并开发了不同特点的爱普思英语教学体系。
向TA提问
展开全部

NET中的三种Timer的区别和用法:

区别:

//1.实现按用户定义的时间间隔引发事件的计时器。此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用。 
System.Windows.Forms.Timer 

// 2.提供以指定的时间间隔执行方法的机制。无法继承此类。 
System.Threading.Timer 

//3.在应用程序中生成定期事件。 
System.Timers.Timer 

这三个定时器位于不同的命名空间内,上面大概介绍了3个定时器的用途,其中第一个是只能在Windows窗体中使用的控件。在.NET1.1里面,第3个System.Timers.Timer,也是可以拖拽使用,而.NET2.0开始取消了,只能手动编写代码。而后2个没有限制制。下面通过具体的列子来看3个Timer的使用和区别。
一 System.Windows.Forms.Timer 
#region System.Windows.Forms.Timer 
public partial class Form1 : Form 

public Form1() 

InitializeComponent(); 


int num = 0; 

private void Form_Timer_Tick(object sender, EventArgs e) 

label1.Text = (++num).ToString(); 
Thread.Sleep(3000); 


private void button1_Click(object sender, EventArgs e) 

Form_Timer.Start(); 


private void button2_Click(object sender, EventArgs e) 

Form_Timer.Stop(); 


#endregion 
上面这个是一个很简单的功能,在Form窗体上拖了一个System.Windows.Forms.Timer控件名字为Form_Timer,在属性窗中把Enable属性设置为Ture,Interval是定时器的间隔时间。双击这个控件就可以看到 Form_Timer_Tick方法

Timer 用于以用户定义的事件间隔触发事件。Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。 
在Timer内部定义的了一个Tick事件,我们前面双击这个控件时实际是增加了一行代码 
this.Form_Timer.Tick += new System.EventHandler(this.Form_Timer_Tick); 

二 System.Timers.Timer 
#region System.Windows.Forms.Timer 
public partial class Form1 : Form 

public Form1() 

InitializeComponent(); 


int num = 0; 
DateTime time1 = new DateTime(); 
DateTime time2 = new DateTime(); 
//定义Timer 
System.Timers.Timer Timers_Timer = new System.Timers.Timer(); 

private void button1_Click(object sender, EventArgs e) 

//手动设置Timer,开始执行 
Timers_Timer.Interval = 20; 
Timers_Timer.Enabled = true; 
Timers_Timer.Elapsed += new System.Timers.ElapsedEventHandler(Timers_Timer_Elapsed); 
time1 = DateTime.Now; 


void Timers_Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 

label1.Text = Convert.ToString((++num)); //显示到lable 
Thread.Sleep(3000); 


private void button2_Click(object sender, EventArgs e) 

//停止执行 
Timers_Timer.Enabled = false; 
time2 = DateTime.Now; 
MessageBox.Show(Convert.ToString(time2-time1)); 


#endregion 

最大的不同就是上面的代码在调试时会报错,提示你"线程间操作无效: 从不是创建控件“label1”的线程访问它。

Timer 是为在多线程环境中用于辅助线程而设计的。服务器计时器可以在线程间移动来处理引发的 Elapsed 事件,这样就可以比 Windows 计时器更精确地按时引发事件。Elapsed 事件在 ThreadPool 线程上引发。如果 Elapsed 事件的处理时间比 Interval 长,在另一个 ThreadPool 线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。 

三 System.Threading.Timer 
#region System.Windows.Forms.Timer 
public partial class Form1 : Form 

public Form1() 

InitializeComponent(); 


int num = 0; 
DateTime time1 = new DateTime(); 
DateTime time2 = new DateTime(); 
System.Threading.Timer Thread_Time; 

private void button1_Click(object sender, EventArgs e) 

//启动 
Thread_Time = new System.Threading.Timer(Thread_Timer_Method,null,0,20); 
time1 = DateTime.Now; 



void Thread_Timer_Method(object o) 

label1.Text = Convert.ToString((++num)); 
System.Threading.Thread.Sleep(3000); 


private void button2_Click(object sender, EventArgs e) 

//停止 
Thread_Time.Dispose(); 
time2 = DateTime.Now; 
MessageBox.Show(Convert.ToString(time2-time1)); 


#endregion 
用Threading.Timer时的方法,和前面就不太相同了,所以的参数全部在构造函数中进行了设置,而且可以设置启动时间。而且没有提供start和stop方法来控制计时器。


static void Main() 

Timer t = new Timer(Test,null,0,1000); 
Console.ReadLine(); 


public static void Test(object o) 

Console.WriteLine("nihao"); 
GC.Collect(); 


最后看下MSDN的描述: 只要在使用 Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。当不再需要计时器时,请使用 Dispose 方法释放计时器持有的资源。如果希望在计时器被释放时接收到信号,请使用接受 WaitHandle 的 Dispose(WaitHandle) 方法重载。计时器已被释放后,WaitHandle 便终止。 

总结: 
System.Threading.Timer 是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。不建议将其用于 Windows 窗体,因为其回调不在用户界面线程上进行。System.Windows.Forms.Timer 是用于 Windows 窗体的更佳选择。要获取基于服务器的计时器功能,可以考虑使用 System.Timers.Timer,它可以引发事件并具有其他功能。 

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式