C#定时器

转载 2015年07月08日 21:34:04

在Framework中存在着4种定时器:其中分为两类,

多线程计时器

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方法。

public static void Main ()
{
//5秒后开始运行,接着每隔1秒的调用Tick方法
Timer tmr = new Timer(Tick, "tick...", 5000, 1000);
Console.ReadLine();
tmr.Dispose();
}
static void Tick(object data)
{
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对象。
public static void MainThread()
{
Timer tmr = new Timer();
tmr.Interval = 500;
tmr.Elapsed += new ElapsedEventHandler(tmr_Elapsed);
tmr.Start();
Console.ReadLine();
tmr.Stop();
Console.ReadLine();
tmr.Start();
Console.ReadLine();
tmr.Dispose();
}

static void tmr_Elapsed(object sender, ElapsedEventArgs e)
{
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消息。

下面是它们的优点:

  1. 你可以忘记线程安全。
  2. 一个Tick事件在前一个Tick事件被处理完毕前不会被触发。
  3. 你可以直接在Tick事件处理代码中更新控件,不需要调用Control.Invoke或Dispatcher.Invoke.

看下在Winform中使用单线程定时器的效果:

//基于Windows消息循环的单线程计时器
private System.Windows.Forms.Timer timer = new Timer() { };

public Form1()
{
InitializeComponent();

timer.Tick += new EventHandler(timer_Tick);
timer.Enabled = true;
}

void timer_Tick(object sender, EventArgs e)
{
//模拟的做一些耗时的操作
System.Threading.Thread.Sleep(2000);
}

如果运行上面的代码,会发现UI界面响应速度很慢,

原理上面已经介绍了:单线程计时器基于Windows消息循环,应用程序会同步的处理计时器的消息。

解决这个问题的方法是使用多线程计时器:只要修改代码使用多线程计时器即可:

//使用多线程计时器
private System.Timers.Timer timer = new System.Timers.Timer();

public Form1()
{
InitializeComponent();

timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Enabled = true;
}

void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//模拟的做一些耗时的操作
System.Threading.Thread.Sleep(2000);
}

上面的例子告诉我们单线程计时器的缺点:

除非Tick事件的处理代码执行的非常快,否则UI界面会变得响应很慢。

所以 WPF和Windows Forms的计时器都非常适合小任务,尤其是界面更新的任务。例如时钟和计数显示。否则,你需要一个多线程计时器

归纳总结C#中的各种定时器

一、单线程定时器 1.System.Windows.Forms.Timer WinForms定时器;单线程定时器,线程安全;运行在UI线程,可直接更新UI画面;执行效率不高,适用于小任务。2.Sy...
  • tiana0
  • tiana0
  • 2016年05月08日 18:34
  • 4606

C#.NET 定时器类及使用方法

在.net常用的定时器类有下面三种,使用定时器时需要设定参数,如间断时间、定时器计溢出后的回调函数、延时、开始等,定时器的的主要方法有开始、终止等,不同的定时器实现上述的方法会有一些差异,本文会针对具...
  • zhouqt
  • zhouqt
  • 2016年06月28日 22:46
  • 10811

C#自己编写定时器

我们在写winfrom时经常会用到定时器,比如客户端通过socket定时向服务器发送检测包等。.netframework提供了一个定时器控件System.Windows.Forms.Timer,使用很...
  • u012725119
  • u012725119
  • 2015年09月10日 15:45
  • 1133

c#中的定时器的使用

在Framework中存在着4种定时器:其中分为两类, 多线程计时器 1:System.Threading.Timer 2:System.Timers.Timer 特殊目的的单线程计时器: ...
  • ycl295644
  • ycl295644
  • 2015年06月08日 16:02
  • 2111

C# .net 定时器,多线程实现定时器

using System; using System.Threading; namespace TimerRunDemo { class Program { /// ...
  • ArvinStudy
  • ArvinStudy
  • 2014年04月04日 16:44
  • 2455

C#中三种定时器对象的比较

 ·关于C#中timer类 在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Ti...
  • holyrong
  • holyrong
  • 2007年09月20日 09:36
  • 2653

C#调用多媒体定时器

在Windows操作系统下,为了获得高精度的定时器,大多数时候采用多媒体定时器,其分辨率可达到1ms,适用于对实时性要求比较高的场合(虽然Windows自身为非实时系统,但是在很多场合还是够用的);而...
  • arlen7772gg
  • arlen7772gg
  • 2016年06月25日 17:59
  • 1180

C#动态定时器+传参定时器

/* * Created by SharpDevelop. * User: Administrator * Date: 2013/11/23 * Time: 21:30 * * To c...
  • jianghuihong2012
  • jianghuihong2012
  • 2013年11月23日 22:26
  • 1781

C#定时器【控制台程序】

 using System;using System.Timers;namespace 定时器ConsoleApplication1{class Class1{    [STAThread]   st...
  • Xw_Andy
  • Xw_Andy
  • 2009年11月28日 17:48
  • 7518

C# 3种定时器对比

功能描述
  • yin554393109
  • yin554393109
  • 2014年08月04日 09:01
  • 620
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#定时器
举报原因:
原因补充:

(最多只允许输入30个字)