当前位置:  编程技术>.net/c#/asp.net

C#各种定时器Timer类的区别与使用介绍

    来源: 互联网  发布时间:2014-08-30

    本文导语:  在使用Timer类时,要考虑到单线程与多线程的问题,不然会遇到些很莫名的问题,这点要注意。 System.Threading.Timer 是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。 在必须更新用户界面的情况下,建议不要...

在使用Timer类时,要考虑到单线程与多线程的问题,不然会遇到些很莫名的问题,这点要注意。

System.Threading.Timer 是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。
在必须更新用户界面的情况下,建议不要使用该计时器,因为它的回调不在用户界面线程上发生。
在此类情况下,System.Windows.Threading.DispatcherTimer 是更好的选择,因为其事件是在用户界面线程上引发的。

按线程归类
多线程计时器
 

1、System.Threading.Timer
2、System.Timers.Timer

特殊目的的单线程计时器:
 

1、System.Windows.Forms.Timer(Windows Forms Timer)
2、System.Windows.Threading.DispatcherTimer(WPF timer);

多线程计时器比较强大,精确,而且可扩展性强;
单线程计时器比较安全,对于更新 Windows Forms controls或者WPF这种简单任务来说更方便。
System.Threading.Timer是最简单的多线程计时器。在下面的例子中,定时器在5秒后开始定时1秒的调用Tick方法。
 

代码示例:
publicstaticvoidMain()
{
//5秒后开始运行,接着每隔1秒的调用Tick方法
Timertmr=newTimer(Tick,"tick...",5000,1000);
Console.ReadLine();
tmr.Dispose();
}
staticvoidTick(objectdata)
{
Console.WriteLine(data);
}

.net framework提供的另一个计时器System.Timers.Timer.简单的对System.Threading.Timer进行了包装。增加了下面几个特性。

实现了Component,所以可以在设计器显示。代替Change方法的一个Interval属性代替callback委托的一个Elapsed事件启动和停止timer的Enabled属性,默认是false。为了避免Enabled造成混乱,提供了Start和Stop方法。是否在每次指定的间隔结束时引发Elapsed时间,还是仅间隔第一次结束后运行的AutoReset属性。在WPF或Windows Forms中安全的调用方法的SynchronizingObject对象。
 

代码示例:

public static void MainThread()
{
Timertmr=newTimer();
tmr.Interval=500;
tmr.Elapsed+=newElapsedEventHandler(tmr_Elapsed);
tmr.Start();
Console.ReadLine();
tmr.Stop();
Console.ReadLine();
tmr.Start();
Console.ReadLine();
tmr.Dispose();
}

staticvoidtmr_Elapsed(objectsender,ElapsedEventArgse)
{
Console.WriteLine("Tick...");
}

单线程计时器:
1:System.Windows.Forms.Timer(Windows Forms Timer)
2:System.Windows.Threading.DispatcherTimer(WPF timer);
单线程计时器是被设计成属于他们执行环境的计时器,如果你在一个Windows服务应用程序中使用Windows Forms的Timer,timer 事件并不会被触发,只有在对应的环境下才会被触发。

像System.Timers.Timer一样,他们也提供了相同的成员(Interval,Tick,Start,Stop),但是他们内部的工作原理不同,

WPF和Windows Forms的计时器使用消息循环机制来取代线程池产生消息的机制。

这意味着Tick事件总是在创建timer的那个线程上执行,同时也意味着如果上一个Tick消息还未被处理,即使时间超过了间隔时间,在消息循环中也只存在一个Tick消息。
 
优点:
忘记线程安全。一个Tick事件在前一个Tick事件被处理完毕前不会被触发。你可以直接在Tick事件处理代码中更新控件,不需要调用Control.Invoke或Dispatcher.Invoke.
看下在Winform中使用单线程定时器的效果:
 

代码示例:

//基于Windows消息循环的单线程计时器
privateSystem.Windows.Forms.Timertimer=newTimer(){};

publicForm1()
{
InitializeComponent();

timer.Tick+=newEventHandler(timer_Tick);
timer.Enabled=true;
}

voidtimer_Tick(objectsender,EventArgse)
{
//模拟的做一些耗时的操作
System.Threading.Thread.Sleep(2000);
}
 

如果运行上面的代码,会发现UI界面响应速度很慢,
原因:单线程计时器基于Windows消息循环,应用程序会同步的处理计时器的消息。
解决方法:
使用多线程计时器:只要修改代码使用多线程计时器即可:
 

代码示例:

//使用多线程计时器
privateSystem.Timers.Timertimer=newSystem.Timers.Timer();

publicForm1()
{
InitializeComponent();

timer.Elapsed+=newSystem.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Enabled=true;
}

voidtimer_Elapsed(objectsender,System.Timers.ElapsedEventArgse)
{
//模拟的做一些耗时的操作
System.Threading.Thread.Sleep(2000);
}

以上示例,展示了单线程计时器的缺点:
除非Tick事件的处理代码执行的非常快,否则UI界面会变得响应很慢。
所以 WPF和Windows Forms的计时器都非常适合小任务,尤其是界面更新的任务。例如时钟和计数显示。否则,你需要一个多线程计时器。
设为1000,再设一个变量每次加1.加12次后做你要做的事,这样就准了。

建议大家亲处测试下上面的例子,哪个比较好用,就选哪一个吧。


    
 
 

您可能感兴趣的文章:

  • C# Timer定时器控件运行时需要修改系统时间的问题
  • c# 在windows服务中 使用定时器实例代码
  • C# 定时器定时更新的简单实例
  • C#中定时器控件Timer的简单用法
  • C#中定时器System.Timers.Timer类的例子
  • C#中Timer定时器控件的使用方法
  • C#中timer类定时器控件的应用实例
  • C# timer 定时器类的用法举例
  • c#定时器使用示例详解
  • C#进度条ProgressBar和定时器Timer控件的应用举例
  • C#中使用System.Timers.Timer定时器控件的例子
  • c#定时器和global实现自动job示例
  • C#中Timer定时器控件实例与原理解析
  • C#中定时器控件Timer学习参考
  • C# Timer定时器控件的应用举例
  • 请问linux下的定时器怎么使用??******************************
  • 网络技术 iis7站长之家
  • 请问Linux下如何使用定时器?
  • 内核定时器使用的错误
  • python定时器使用示例分享
  • 有关定时器使用的一个问题,谢谢!
  • Cocos2d-x Schedule定时器的使用实例
  • linux下,定时器怎么使用?想定时1s,1s到后跳转到相应的处理函数。谢谢
  • java当中的定时器的4种使用方式
  • java使用TimerTask定时器获取指定网络数据
  • linux使用select实现精确定时器详解
  • jquery插件jTimer(jquery定时器)使用方法
  • libevent库的使用--定时器的使用实例
  • Linux定时器问题,使用ITIMER_REAL实现系统调用gettimeofday()所实现的功能时出错,请教各位!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux 多个定时器 几乎同时到时 , 部分定时器信号 丢失的问题.
  • 定时器的问题请教
  • Linux用户态可以通过同一段程序创建多个定时器么?
  • 请问如何实现多个并行的定时器?
  • 想做个定时器,不知道怎么做?
  • Jquery定时器的简单示例
  • 定时器如何销毁?
  • linux 定时器销毁
  • 请教关于unix中定时器的语法
  • linux中的串口通信判断一帧数据是否传输完整时,用定时器检查前后两帧数据的间隔时间,该用什么定时函数,有详细代码最好,谢谢!
  • tcp重传定时器,怎么实现的啊?
  • Linux 提供的基于文件描述符的定时器接口
  • 如何实现多定时器?
  • linux下如何设置高精度定时器?
  • linux定时器!
  • 定时器与getchar()的问题??奇怪!
  • 多定时器问题
  • 关于select定时器的问题
  • 定时器问题
  • 有关定时器在多核CPU上运行的一个问题?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3