c#各种Timer类的区别与用法介绍

 更新时间:2013年10月22日 10:18:13   作者:  
System.Threading.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对象。publicstaticvoidMainThread()

复制代码 代码如下:

{
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次后做你要做的事,这样就准了.

上面是2种自己使用一下,感觉那个好就可以了。

相关文章

  • WPF程序将控件所呈现的内容保存成图像

    WPF程序将控件所呈现的内容保存成图像

    这篇文章介绍了WPF程序将控件所呈现的内容保存成图像的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 深入探讨C#中的const、readonly关键字

    深入探讨C#中的const、readonly关键字

    这篇文章主要介绍了深入探讨C#中的const、readonly关键字,本文可以帮助你深刻理解这两个关键字,而且是面试中最可能面试到的问题哦,需要的朋友可以参考下
    2014-08-08
  • C#支付宝扫码支付代码完整版

    C#支付宝扫码支付代码完整版

    这篇文章主要为大家详细介绍了C#支付宝扫码支付代码的完整版本,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • c#文件下载示例的4种方法分享

    c#文件下载示例的4种方法分享

    这篇文章主要介绍了c#文件下载示例的4种方法,有TransmitFile实现下载,WriteFile实现下载,WriteFile分块下载,流方式下载,需要的朋友可以参考下
    2014-03-03
  • c#后台线程访问前台控件并显示信息示例

    c#后台线程访问前台控件并显示信息示例

    这篇文章主要介绍了c#后台线程访问前台控件并显示信息示例,需要的朋友可以参考下
    2014-03-03
  • 利用thrift实现js与C#通讯的实例代码

    利用thrift实现js与C#通讯的实例代码

    利用thrift实现js与C#通讯的实例代码,需要的朋友可以参考一下
    2013-04-04
  • C#中事件的继承实例分析

    C#中事件的继承实例分析

    这篇文章主要介绍了C#中事件的继承,通过一个面向对象程序实例来说明子类调用父类事件的实现方法,需要的朋友可以参考下
    2014-08-08
  • C#实现FTP上传文件的方法

    C#实现FTP上传文件的方法

    这篇文章介绍了C#实现FTP上传文件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#实现绘制浮雕图片效果实例

    C#实现绘制浮雕图片效果实例

    这篇文章主要介绍了C#实现绘制浮雕图片效果实例,是C#程序设计中非常实用的一个功能,需要的朋友可以参考下
    2014-08-08
  • C#连接SQL Server的实现方法

    C#连接SQL Server的实现方法

    这篇文章主要给大家介绍了关于C#连接SQL Server的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12

最新评论