喃疯
易定者无感,易感者无定

相信有好多人跟我一样会经常把计时器与定时器两个概念搞混,今天专门去查了一下字典

定时器与计时器的区别:                         

计数器是当你开始从0开始计数时一直不停的开始记数!除非你让他停下来要不他会不停的记下去!
而定时器则是不一样的!
是需要你自己先设定一个时间然后开始倒计时!当你的所定时间倒计完以后,他就自动停止下来了!

在实际的开发过程中定时器应该是我们使用挺频繁的一个东西,今天就把C#中使用的几种定时器做一个总结,

1、System.Timers.timer 定时器是  System.Timers命名空间下的Timer类。是一种基于服务器的计时器,它使您能够指定在应用程序中引发 Elapsed 事件的周期性间隔。然后可以操控此事件以提供定期处理。

      基于服务器的 Timer 是为在多线程环境中用于辅助线程而设计的。服务器计时器可以在线程间移动来处理引发的 Elapsed 事件,这样就可以比 Windows 计时器更精确地按时引发事件。

       书写方法:

 1 //实例化Timer类,设置间隔时间为10000毫秒;
 2 System.Timers.Timer t =  new System.Timers.Timer();
 3 t.Interval=1000;
 4 t.Elapsed +=  new System.Timers.ElapsedEventHandler(timeout);  //到达时间的时候执行倒计时事件timeout;
 5  
 6 t.AutoReset = true;  //设置是执行一次(false)还是一直执行(true);
 7  
 8 //需要调用 timer.Start()或者timer.Enabled = true来启动它, timer.Start()的内部原理还是设置timer.Enabled = true;
 9  
10 //调用 timer.Stop()或者timer.Enabled = false来停止引发Elapsed事件, timer.Stop()的内部原理还是设置timer.Enabled = false,
11  
12 //最重要的是timer.Enabled = false后会取消线程池中当前等待队列中剩余任务的执行。
13  
14 t.Enabled = true;
15  
16 //倒计时事件
17 public void timeout(object source, System.Timers.ElapsedEventArgs e)
18 {
19   if (disConnectCount >= 3)//到时间判断条件,执行响应的事件停止计时
20      {
21             t.Stop();
22             return;
23      }
24 }

需要注意的是:

1、默认的周期是0.1秒执行一次;

2、AutoReset的初始值为true.

3、它的timer机制和System.Threading.Timer 原理是一样的。

4、每次周期(Timer)运行一次会新起一个线程。

5、如果Elapsed事件的处理时间比Interval长,它每个周期执行都会新起一个线程,这个线程的执行时间不受interval的限定,可以比interval长,因为一个新周期执行,又会新起一个线程,Timer起的线程周期就是事件处理时间。

Elapsed事件绑定相当于另开了一个线程,也就是说在Elapsed绑定的事件里不能访问其它线程里的控件(需要定义委托,通过Invoke调用委托访问其它线程里面的控件)。

 

2、System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet。

Timer控件只有绑定了Tick事件和设置Enabled=True后才会自动计时,停止计时可以用Stop()方法控制,通过Stop()停止之后,如果想重新计时,可以用Start()方法来启动计时器。Timer控件和它所在的Form属于同一个线程;

是WinForm的计时器,在WPF中也可以使用,不过必须添加System.Windows.Forms的引用

使用方法:

 1 System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
 2  
 3 myTimer.Tick += new EventHandler(timer1_Tick);
 4 myTimer.Enabled = true;
 5 myTimer.Interval = 1000;
 6 myTimer.Start();
 7  
 8 private void timer1_Tick(object sender, EventArgs e)
 9         {
10         }

3、System.Threading.Timer 线程定时器

是一个使用回调方法的计时器,而且由线程池线程服务,简单且对资源要求不高。

在很多时间我们都需要进行延迟执行,或是定时执行一些指定业务,这个时候使用 Timer 是最合适的,而且 Timer 是Cpu 级别处理对系统影响很少,就算创建上千上万个 Timer 也不会影响。

故见意多使用 Timer 是一个很好的定时任务器。

使用方法:

1 private System.Threading.Timer timerClose;
//第一个参数是:回调方法,表示要定时执行的方法,第二个参数是:回调方法要使用的信息的对象,或者为空引用,第三个参数是:调用 callback 之前延迟的时间量(以毫秒为单位),指定 Timeout.Infinite 以防止计时器开始计时。指定零 (0) 以立即启动计时器。第四个参数是:定时的时间时隔,以毫秒为单位      
3 timerClose = new System.Threading.Timer(new TimerCallback(timerCall), this, 5000, 0);
4  
5 private void timerCall(object obj)
6 {
7 timerClose.Dispose();
8 this.Close();
9 }

注意:

Callback:一个 TimerCallback 委托,表示要执行的方法。
State:一个包含回调方法要使用的信息的对象,或者为空引用(Visual Basic 中为 Nothing)。
dueTime:调用 callback 之前延迟的时间量(以毫秒为单位)。指定 Timeout.Infinite 以防止计时器开始计时。指定零 (0) 以立即启动计时器。
Period:调用 callback 的时间间隔(以毫秒为单位)。指定 Timeout.Infinite 可以禁用定期终止。

当不再需要一个计时器时,使用 Dispose 计时器持有方法来释放资源

 

 

4、DispatcherTimer 是专门未WPF 设计的定时器

 DispatcherTimer定时器不是单独开启一个线程来运行定时器方法,是运行在UI线程上的,只是通过改变运行优先级来实现定时器,当定时器时间到了,主线程就转去执行定时器方法。因此DispatcherTimer定时器不要用来实现执行时间长的任务。

DispatcherTimer定时器第一次执行是先等待指定周期的时间再执行定时器方法,而不是先执行再计时;然后,执行完定时器方法后,再等待指定周期的时间。

   使用方法:

DispatcherTimer timer;

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    timer = new DispatcherTimer();
    timer.Interval = TimeSpan.FromMilliseconds(64);
    timer.Tick += timer1_Tick;
    timer.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    //定时执行的内容
}

注意:DispatcherTimer使用不当会导致内存泄漏

 DispatcherTimer运行在UI线程上,可以方便地修改UI元素,但是当界面显示比较复杂的时候,UI线程的实时刷新任务比较重,此时不应该用DispatcherTimer做严格周期性任务,而应改用Timer或其他的定时器。

计时器

1、使用 Stopwatch 类 (System.Diagnostics.Stopwatch)

Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间。

使用方法:

 

System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();

stopwatch.Start();
//任务 1...
stopwatch.Stop();
_result.Text += "<p>任务 1 用时:" + stopwatch.ElapsedTicks + "。</p>";

stopwatch.Reset(); //若没有 Reset,则会把任务 1 的用时累计进入任务 2
stopwatch.Start();
//任务 2...
stopwatch.Stop();
_result.Text += "<p>任务 2 用时:" + stopwatch.ElapsedTicks + "。</p>";

 

2、System.Environment.TickCount 最大支持49.2天

TickCount属性用来获取来自计算机的系统计时器的毫秒计数。

用法:

int startTime=System.Environment.TickCount;
......任务......
int endTime=System.Environment.TickCount;
int runTime=endTime-startTime;(注意单位是毫秒哦!)

3、使用TimeSpan类(System.TimeSpan)

    TimeSpan 对象表示时间间隔或持续时间,按正负天数、小时数、分钟数、秒数以及秒的小数部分进行度量。用于度量持续时间的最大时间单位是天。更大的时间单位(如月和年)的天数不同,因此为保持一致性,时间间隔以天为单位来度量。

    TimeSpan 对象的值是等于所表示时间间隔的刻度数。一个刻度等于 100 纳秒,TimeSpan 对象的值的范围在 MinValue 和 MaxValue 之间。

    TimeSpan 值可以表示为 [-]d.hh:mm:ss.ff,其中减号是可选的,它指示负时间间隔,d 分量表示天,hh 表示小时(24 小时制),mm 表示分钟,ss 表示秒,而 ff 为秒的小数部分。即,时间间隔包括整的正负天数、天数和剩余的不足一天的时长,或者只包含不足一天的时长。例如,初始化为 1.0e+13 刻度的 TimeSpan 对象的文本表示“11.13:46:40”,即 11 天,13 小时,46 分钟和 40 秒。

使用方法:

 1 System.DateTime startTime,endTime;
 2 
 3  
 4 System.TimeSpan time;
 5 
 6 startTime=System.DateTime.Now;
 7 
 8 ......任务......
 9 
10 endTime=System.DateTime.Now;
11 
12 time=endTime-startTime;
13 
14 int runTime=time.Milliseconds;(以毫秒为单位)

 

 

 

posted on 2021-02-19 11:01  周子安  阅读(2018)  评论(0)    收藏  举报