C#计时器的三种实现方法

在.NET中有三种计时器:

一、 System.Windows.Forms命名空间下的Timer控件,和所在的Form属于同一个线程。Timer控件只有绑定了Tick事件和设置Enabled属性为True之后才会自动计时,Stop()方法,Start()方法启动计时器重新计时;

MyTimer.Enabled = true;  //启动计时器
MyTimer.Interval = 1000; //设置计时器时间间隔,单位为ms
MyTimer.Stop(); //停止计时
MyTimer.Start(); //重新计时

设计界面:

代码:

public partial class Timer : Form
  {
    System.DateTime TimeNow = new DateTime();
    TimeSpan TimeCount = new TimeSpan();
    public Timer()
    {
      InitializeComponent();
    }
    private void btnTimeStart_Click(object sender, EventArgs e)
    {
      MyTimer.Start();
      TimeNow = DateTime.Now;
    }
    private void Timer_Load(object sender, EventArgs e)
    {
      MyTimer.Interval = 1000;
    }
    private void btnTimeStop_Click(object sender, EventArgs e)
    {
      MyTimer.Stop();
    }
    private void MyTimer_Tick(object sender, EventArgs e)
    {
      TimeCount = DateTime.Now - TimeNow;
      txtTimeShow.Text = string.Format("{0:00}:{1:00}:{2:00}", TimeCount.Hours, TimeCount.Minutes, TimeCount.Seconds);
    }
    private void txtTimeShow_TextChanged(object sender, EventArgs e)
    {
    }
  }

代码里使用了DateTime.Now获取当前系统时间,TimeSpan变量取得时间间隔

二、system.Timers命名空间下的Timer类,使用Elapsed事件另开一个线程。定义一个System.Timers.Timer对象,然后绑定Elapsed事件,通过Start()方法来启动计时,通过Stop()方法或者Enable=false停止计时;

Mytimer.AutoReset = true; //每次达到指定间隔时间后,就触发System.Timers.Timer.Elapsed事件

设计界面:

代码:

public partial class Timer2 : Form
  {
    //定义Timer类变量
    System.Timers.Timer Mytimer;
    long TimeCount;
    //定义委托
    public delegate void SetControlValue(long value);
    public Timer2()
    {
      InitializeComponent();
    }
    private void label1_Click(object sender, EventArgs e)
    {
    }
    //开始计时
    private void btnTimeStart_Click(object sender, EventArgs e)
    {
      Mytimer.Start();
      TimeCount = 0;
    }
    //停止计时
    private void btnTimeStop_Click(object sender, EventArgs e)
    {
      Mytimer.Stop();
    }
    private void Timer2_Load(object sender, EventArgs e)
    {
      //设置时间间隔ms
      int interval = 1000;
      Mytimer = new System.Timers.Timer(interval);
      //设置重复计时
      Mytimer.AutoReset = true;
      //设置执行System.Timers.Timer.Elapsed事件
      Mytimer.Elapsed += new System.Timers.ElapsedEventHandler(Mytimer_tick);
    }
    private void Mytimer_tick(object sender, System.Timers.ElapsedEventArgs e)
    {
      this.Invoke(new SetControlValue(ShowTime), TimeCount);
      TimeCount++;
    }
    private void ShowTime(long t)
    {
      TimeSpan temp = new TimeSpan(0,0,(int)t);
      txtTimeShow.Text = string.Format("{0:00}:{1:00}:{2:00}", temp.Hours, temp.Minutes,temp.Seconds);
    }
    private void txtTimeShow_TextChanged(object sender, EventArgs e)
    {
    }
  }

代码中利用TimeSpan将计数器的整数转化为DateTime日期。

和Timer控件相比,System.Timers.Timer.Elapsed事件相当于控件的Tick事件,只不过需要自己添加事件。

三、System.Threading.Timer类。定义Timer类时,通过构造函数进行初始化。

最常用的构造形式:

Timer(TimerCallback callback, object state , uint duetime , uint period)

callback: 回调方法必须是TimerCallback委托形式的:void TimerCallback(object state)

state:要传入的对象引用,可以为null

duetime:回调首次被调用之前的时间,如果被设置为Timeout.Infinite则会停止计时

period:两次回调之间的时间间隔,如果被设置为Timeout.Infinite则回调只调用一次

代码:

public partial class Timer2 : Form
  {
    System.Threading.Timer Mytimer;
    long TimeCount;
    delegate void SetValue();
    public Timer2()
    {
      InitializeComponent();
    }
    private void label1_Click(object sender, EventArgs e)
    {
    }
    private void TimerUp(object state)
    {
      this.Invoke(new SetValue(ShowTime));
      TimeCount++;
    }
    public void ShowTime()
    {
      TimeSpan t = new TimeSpan(0,0, (int)TimeCount);
      txtTimeShow.Text = string.Format("{0:00}:{1:00}:{2:00}",t.Hours,t.Minutes,t.Seconds);
    }
    //开始计时
    private void btnTimeStart_Click(object sender, EventArgs e)
    {
      TimeCount = 0;
      Mytimer.Change(0, 1000);
    }
    //停止计时
    private void btnTimeStop_Click(object sender, EventArgs e)
    {
      Mytimer.Change(Timeout.Infinite, 1000);
    }
    private void Timer2_Load(object sender, EventArgs e)
    {
      Mytimer = new System.Threading.Timer(new TimerCallback(TimerUp), null, Timeout.Infinite, 1000);
    }
    private void txtTimeShow_TextChanged(object sender, EventArgs e)
    {
    }
  }

在上面所述的三种计时器中,第一种计时器和所在的Form处于同一个线程,因此执行的效率不高;而第二种和第三种计时器执行的方法都是新开一个线程,所以执行效率比第一种计时器要好,因此在选择计时器时,建议使用第二种和第三种。

总结

以上所述是小编给大家介绍的C#计时器的三种实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • c#编写的番茄钟倒计时器代码

    恩  主要大家可以看下思路吧  图形界面里 除了图标和音乐两个资源 别的都是代码. 时间没有用timer组件 是自创的Time类在一个线程中进行的倒计时.  对于导出记录 创建了一个Record类  别的就没什么了  .... Program.cs 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace 番茄钟 {   

  • C#实现的Win32控制台线程计时器功能示例

    本文实例讲述了C#实现的Win32控制台线程计时器功能.分享给大家供大家参考,具体如下: 在C#中提供了三种类型的计时器: 1.基于 Windows 的标准计时器(System.Windows.Forms.Timer) 2.基于服务器的计时器(System.Timers.Timer) 3.线程计时器(System.Threading.Timer) 一.基于 Windows 的标准计时器(System.Windows.Forms.Timer) 首先注意一点就是:Windows 计时器是为单线程环境

  • C#中计时器的简单实现方法示例

    本文实例讲述了C#中计时器的简单实现方法.分享给大家供大家参考,具体如下: startTime = DateTime.Now; DispatcherTimer dt = new DispatcherTimer(); dt.Interval = new TimeSpan(0, 0, 1); dt.Tick += new EventHandler(dt_Tick);//调用函数 dt.Start(); void dt_Tick(object sender, EventArgs e) { timeSp

  • C#中各种计时器用法小结

    本文实例总结了C#中各种计时器用法.分享给大家供大家参考,具体如下: 1.使用 Stopwatch 类 (System.Diagnostics.Stopwatch) Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间.在典型的 Stopwatch 方案中,先调用 Start 方法,然后调用 Stop 方法,最后使用 Elapsed 属性检查运行时间. Stopwatch 实例或者在运行,或者已停止:使用 IsRunning 可以确定 Stopwatch 的

  • C#线程倒计时器源码分享

    本文实例为大家分享了C#线程倒计时器源码,供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; namespace ListZZBG { class TimeHeleper { Thread thread; private TimeSpan time;

  • C#计时器的三种实现方法

    在.NET中有三种计时器: 一. System.Windows.Forms命名空间下的Timer控件,和所在的Form属于同一个线程.Timer控件只有绑定了Tick事件和设置Enabled属性为True之后才会自动计时,Stop()方法,Start()方法启动计时器重新计时: MyTimer.Enabled = true;  //启动计时器 MyTimer.Interval = 1000; //设置计时器时间间隔,单位为ms MyTimer.Stop(); //停止计时 MyTimer.Sta

  • Android时分秒计时器的两种实现方法

    可能我们在开发中会时常用到计时器这玩意儿,比如在录像的时候,我们可能需要在右上角显示一个计时器.这个东西其实实现起来非常简单. 只需要用一个控件Chronometer,是的,就这么简单,我都不好意思讲述一下了. <Chronometer android:layout_width="wrap_content" android:layout_height="wrap_content" android:format="%s" android:id

  • Android计时器的三种实现方式(Chronometer、Timer、handler)

    本文实例为大家分享了Android计时器的三种方法,具体内容如下 目录: 1.借助Timer实现 2.调用handler.sendMessagedely(Message msg, long delayMillis) 3.借助布局Chronometer 1.借助Timer实现 (1) 布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http:/

  • JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    1.Object类 在JS中,Object是所有类的基类,使用Object类来创建自定义对象时,可以无需定义构造函数(constructor,prototype,hasOwnProperty(property)) var per = new Object(); per.name = 'zhangsan'; per.age = ; alert(per.name + per.age); 我们想在程序中得到一个对象变量,只要能存储大量数据即可,这个时候,我们可以考虑使用Object类.Object类避

  • C语言中函数指针的三种使用方法总结

     C语言中函数指针的三种使用方法总结 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能使彼此更加成长. 定义方式:int (*p)(int x, int y); 实现代码: #include <stdio.h> int sum(int x, int y){ return x + y; } int reduce(int x, int y){ return x - y; } int

  • ajax 三种实现方法实例代码

    ajax即异步的javascript and xml, 本文章向码农们介绍ajax的三种实现方法(prototype实现,jquery实现,XMLHttpRequest实现) 本文主要是比较三种实现Ajax的方式,为以后的学习开个头. 准备: 1.  prototype.js 2.  jquery1.3.2.min.js 3.  json2.js 后台处理程序(Servlet),访问路径servlet/testAjax: Java代码 package ajax.servlet; import j

  • spring与mybatis三种整合方法

    1.采用MapperScannerConfigurer,它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean. spring-mybatis.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3

  • JavaScript定义函数的三种实现方法

    JavaScript定义函数的三种实现方法 [1]正常方法 function print(msg){ document.write(msg); } 对函数进行调用的几种方式: 函数名(传递给函数的参数1,传递给函数的参数2,-.) 变量 = 函数名(传递给函数的参数1,传递给函数的参数2,-.) 对于有返回值的函数调用,也可以在程序中直接使用返回的结果,例如:alert("sum=" + square(2,3)); 不指定任何函数值的函数,返回undefined. [2]构造函数方法 

  • java 多线程的三种构建方法

    java  多线程的三种构建方法 继承Thread类创建线程类 public class Thread extends Object implements Runnable 定义Thread类的子类,并重写其run()方法 创建Thread子类的实例,即创建了线程对象 调用线程对象的start()方法启动线程 public class FirstThread extends Thread { public void run(){ for(int i=0;i<100;i++){ /* * Thre

  • jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法

    首先,大家都知道,jQuery事件触发时有2种机制,一种是事件委托,另一种是事件冒泡(IE情况暂时不考虑).拿click事件做例子,先附上一段代码: html: <body> <div id="box"> <p id="btn">我是按钮</p> </div> </body> style: .hid{ display:none; } script: $('#box').click(functio

随机推荐