.NET中的Timer类型用法详解

时间:2022-01-26 05:14:31
这篇文章主要介绍了.NET中的Timer类型用法,较为详细的分析了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的单线程计时器都非常适合小任务,尤其是界面更新的任务。例如时钟和计数显示。
否则,你只能使用多线程计时器,对于使用哪一种多线程计时器,可根据自己的需要来决定

希望本文所述对大家掌握.net中timer的用法有所帮助。

.NET中的Timer类型用法详解的更多相关文章

  1. Oracle数据库中序列(SEQUENCE)的用法详解

    Oracle数据库中序列(SEQUENCE)的用法详解   在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...

  2. delphi中Application.MessageBox函数用法详解

    delphi中Application.MessageBox函数用法详解 Application.MessageBox是TApplication的成员函数,声明如下:functionTApplicati ...

  3. SVN中tag branch trunk用法详解

    SVN中tag branch trunk用法详解 2010-05-24 18:32 佚名 字号:T | T 本文向大家简单介绍一下SVN中tag branch trunk用法,SVN中tag bran ...

  4. ElasticSearch中辅助API常用用法详解

    本篇是使用Elasticsearch必不可少的必备知识,并且适用于所有的Rest Api. 返回数据格式化 当在Rest请求后面添加?pretty时,结果会以Json格式化的方式显示.另外,如果添加? ...

  5. ubuntu中rar与unrar用法详解

    本文转载:http://helloklzs.iteye.com/blog/1139993 安装: sudo apt-get install rar 这样就可以安装了 删除是以下语句 sudo apt- ...

  6. 编程中,static的用法详解

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用.一.面向过程设计中的sta ...

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

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

  8. JDK中的Timer和TimerTask详解(zhuan)

    http://www.cnblogs.com/lingiu/p/3782813.html ************************************************** 目录结构 ...

  9. sql语句中like匹配的用法详解

    在SQL结构化查询语言中,LIKE语句有着至关重要的作用. LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用 ...

随机推荐

  1. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

  2. mate-desktop安装在其他目录时一些配置信息

    1.mate-desktop安装在其他目录时一些配置信息 2.BIN目录下添加相应的mate-session_gtk2/3 3.首先配置如下环境变量 #!/bin/sh if [[ "${E ...

  3. 跳转页面&回到上一页

    1.php <?php header('Location:2.php'); //echo不能在其前面 echo '1'; 2.js <?php echo '2'; echo '<me ...

  4. 可选的Web Components类库

    首先需要说明的是这不是一篇 Web Components 的科普文章,如果对此了解不多推荐先读<A Guide to Web Components>. 有句古话-“授人以鱼,不如授人以渔” ...

  5. 设置webstorm缩写代码

    文件 ->设置->编辑器->活动模板->找到需要设置的文件类型(比如JavaScript)-->添加-(右上角)->设置模板之后,注意最后需要defind才能生效

  6. ssh远程登录操作 和ssh信任

    ssh 可以参考上一篇telnet的文章 1.安装openssh-server     sudo dpkg -i openssh-client_1%3a5.5p1-4ubuntu6_i386.deb ...

  7. STL用法整理

    百度百科 STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称.从根本上说,STL是一些“容器”的集合,这些“容器”有list,vect ...

  8. 设置 Confluence 6 外部索引站点

    Confluence 并不能比较容易的对外部站点进行搜索,这个是因为 Confluence 使用的是 Lucene 内部查找,但是你还是有下面 2 个可选的方案: 嵌入外部页面到 Confluence ...

  9. &lbrack;转载&rsqb;安装Oracle11gR2先决条件检查失败的详细解决处理过程

    原文地址:安装Oracle11gR2先决条件检查失败的详细解决处理过程作者:四海名汀 最近在32位Win7系统下安装Oracle11g发现一系列错误,现将详细的错误解决过程记录如下,以供大家参考. 一 ...

  10. 查找-&gt&semi;静态查找表-&gt&semi;顺序查找&lpar;顺序表&rpar;

    文字描述 顺序查找的查找过程为:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录:反之,若直至第一个记录,其关键字和给定值比较都 ...