.NET中的Timer类型用法详解(转)

在.NET FrameWork中有多个Timer,那么怎么根据实际情况进行选择确实是一个问题。

总体而言,计时器共有以下四种:

多线程计时器:

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或者WPF 中控件的值 这种简单任务来说更方便。
例如时钟和计数显示。否则,你需要一个多线程计时器。

原理:单线程使用消息循环机制,这意味着Tick事件总是在创建timer的那个线程上执行,同时也意味着如果上一个Tick消息还未被处理,即使时间超过了间隔时间,在消息循环中也只存在一个Tick消息。

示例代码如下:

public static void Main()  

{  

    System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer();  

    tmr.Tick += new EventHandler(tmr_Tick);  

    tmr.Start();//开始计时器  

    tmr.Stop();//停止计时器  

    tmr.Enabled =true;//设置或获取计时器是否正在运行  

    tmr.Interval = 10000; //计时器的时间间隔 (10秒),以毫秒为单位,在计时器事件tmr_Tick开始10秒后进行第一次执行.  

}  

 void tmr_Tick(object sender, EventArgs e)  

{  

   //到达指定时间间隔应处理的代码  

} 

多线程计时器比较强大,精确,而且可扩展性强;使用多线程计时器时不会对主线程造成任何影响

原理:多线程计时器使用回调方法并由线程池线程提供服务.当计时器间隔小于执行此回调(Tick方法)所需的时间时,回调可以同时在多个线程中执行,比如当计时器的时间间隔是5秒,但过了5秒后,上一次的回调仍未完成,此时新的回调将在新的线程中运行.在开发中需要避免此种情况。

System.Threading.Timer是最简单的多线程计时器。
只要在使用
System.Threading.Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer
仍处在活动状态,也会被回收。
 
在下面的例子中,计时器在5秒后开始定时1秒的调用Tick方法。

public static void Main()
{  

    int duetime = 5000;  

    int period = 1000;  

    System.Threading.Timer timer = new System.Threading.Timer(Tick,"给Tick方法传的参数,object类型",duetime ,period );  

    duetime = 10000;  

    period = 2000;  

    //修改等待时间为10秒和间隔时间为2秒  

    timer.Change(duetime, period);  

    //取消计时器  

    timer.Dispose();  

}  

static void Tick(object data)  

{  

     Console.WriteLine(data);  

      //如果此时需要访问控件,因为回调线程跟主线程是完全不同的两个线各,因此需要使用Control.Invoke或BeginInvoke方法,来实现,例如:  

     this.BeginInvoke((MethodInvoker)delegate()  

     {  

         this.lbl_w.Text = data.ToString ();  

     });   

 } 

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

1.实现了Component,所以可以在设计器显示。
2.用Interval属性代替代替Change方法
3.添加了Elapsed事件, 启动和停止timer的Start和Stop方法。
4.添加了AutoReset属性 默认为True
来指定是否在每次指定的间隔结束时引发Elapsed事件,还是仅运行一次Elapsed事件就结束

示例代码如下:

public static void MainThread()  

{  

      System.Timers.Timer Timer tmr=new System.Timers.Timer();  

      tmr.Interval=500;  

      tmr.Elapsed+=newElapsedEventHandler(tmr_Elapsed);  

      tmr.AutoReset = false;  

      tmr.Start();  

      Console.ReadLine();  

      tmr.Stop();  

      Console.ReadLine();  

      tmr.Dispose();  

}  

void tmr_Elapsed(objectsender,ElapsedEventArgse)
 {  

      Console.WriteLine("Tick...");  

} 

结论:
WPF和Windows
Forms的单线程计时器都非常适合小任务,尤其是界面更新的任务。例如时钟和计数显示。
否则,你只能使用多线程计时器,对于使用哪一种多线程计时器,可根据自己的需要来决定

时间: 2024-11-05 15:00:48

.NET中的Timer类型用法详解(转)的相关文章

Oracle中常用的to_Char用法详解

Oracle中常用的to_Char用法详解(有FMT的详细列表) The following are number examples for the to_char function. to_char(1210.73, '9999.9') would return '1210.7' to_char(1210.73, '9,999.99') would return '1,210.73' to_char(1210.73, '$9,999.00') would return '$1,210.73'

VC++中MessageBox的常见用法详解

消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.         1.MessageBox("这是一个最简单的消息框!");         2.MessageBox("这是一个有标题的消息框!","这是标题");         3.MessageBox("这是一个确定 取消的消息框!","这是标题", MB_OKCANCEL );         4.Messa

struts2中<s:checkboxlist/>的用法详解

Html代码 选择角色<br> <s:checkboxlist list="#request.roleuserList" listKey="roleId" listValue="roleName" value="#request.rolelist.{roleId}" name="roleIds"></s:checkboxlist> 说明: 其中#request.roleu

css3中font-face属性的用法详解

@font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体,你们当中或许有许多人会不自然的问,这样的东西IE能支持吗?当我告诉大家@font-face这个功能早在IE4就支持了你肯定会感到惊讶.我的Blog就使用了许多这样的自定义Web字体,比如说首页的Logo,Tags以及页面中的手写英文体,很多朋友问我如何使用,能让自己的页面也支持这样的自定义字体,一句话这些都是@fo

Java中static作用及用法详解

1.1概述: static是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在.这样做有什么意义呢?在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是用static修饰的成员可以通过类名加".&q

JDK中的Timer和TimerTask详解

目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 schedule VS. scheduleAtFixedRate 一些注意点 1. Timer和TimerTask Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次. TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务. 2.

SVN中tag branch trunk用法详解

SVN中tag branch trunk用法详解 2010-05-24 18:32 佚名 字号:T | T 本文向大家简单介绍一下SVN中tag branch trunk用法,SVN中tag branch trunk都属于SVN的子命令,那么他们是如何使用的呢,本文就给大家一一讲解. AD:干货来了,不要等!WOT2015 北京站演讲PPT开放下载! 本节主要讲解一下SVN中tag branch trunk的用法,在SVN中Branch/tag在一个功能选项中,在使用中也往往产生混淆.这里就向大

【转】SVN中trunk,branches,tags用法详解

SVN中trunk,branches,tags用法详解 Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是 svn://proj/|+-trunk+-branches+-tags这是一个标准的布局,trunk为主开发目录,branches为分支开发目录,tags为tag存档目录(不允许修 改).但是具体这几个目录应该如何使用,svn并没有明确的规范,更多的还是用户自己的习惯. 对于这几个开发目录,一般的使用方法有两

C#中的IDisposable模式用法详解

本文实例讲述了C#中IDisposable模式的用法,针对垃圾资源的回收进行了较为详细的讲解.分享给大家供大家参考之用.具体方法如下: 首先,对于垃圾回收而言,在C#中,托管资源的垃圾回收是通过CLR的Garbage Collection来实现的,Garbage Collection会调用堆栈上对象的析构函数完成对象的释放工作:而对于一些非托管资源,比如数据库链接对象等,需要实现IDisposable接口进行手动的垃圾回收.那么什么时候使用Idisposable接口,以及如何使用呢? 先来参考一