C#的四种Timer介绍
一.Timer的几个类别
1.System.Threading.Timer
2.System.Timers.Timer
3.System.Windows.Forms.Timer
4.System.Windows.Threading.DispatcherTimer
二.System.Threading.Timer
他的源代码里是这样写的:

public sealed class Timer : MarshalByRefObject, IDisposable
{
// Fields
private TimerHolder m_timer;
private const uint MAX_SUPPORTED_TIMEOUT = 0xfffffffe; // Methods
[MethodImpl(MethodImplOptions.NoInlining), SecuritySafeCritical]
public Timer(TimerCallback callback);
[MethodImpl(MethodImplOptions.NoInlining), SecuritySafeCritical, __DynamicallyInvokable]
public Timer(TimerCallback callback, object state, int dueTime, int period);
[MethodImpl(MethodImplOptions.NoInlining), SecuritySafeCritical]
public Timer(TimerCallback callback, object state, long dueTime, long period);
[MethodImpl(MethodImplOptions.NoInlining), SecuritySafeCritical, __DynamicallyInvokable]
public Timer(TimerCallback callback, object state, TimeSpan dueTime, TimeSpan period);
[MethodImpl(MethodImplOptions.NoInlining), CLSCompliant(false), SecuritySafeCritical]
public Timer(TimerCallback callback, object state, uint dueTime, uint period);
[__DynamicallyInvokable]
public bool Change(int dueTime, int period);
public bool Change(long dueTime, long period);
[__DynamicallyInvokable]
public bool Change(TimeSpan dueTime, TimeSpan period);
[CLSCompliant(false)]
public bool Change(uint dueTime, uint period);
[__DynamicallyInvokable]
public void Dispose();
public bool Dispose(WaitHandle notifyObject);
internal void KeepRootedWhileScheduled();
[SecurityCritical]
internal static void Pause();
[SecurityCritical]
internal static void Resume();
[SecurityCritical]
private void TimerSetup(TimerCallback callback, object state, uint dueTime, uint period, ref StackCrawlMark stackMark);
}

主要有四个参数。
CallBack,一个返回值为void,参数为object的委托,也是计时器执行的方法。
state,计时器执行方法的的参数。
dueTime,调用 callback 之前延迟的时间量(以毫秒为单位)。
period,调用 callback 的时间间隔。
例:System.Threading.Timer tm=new System.Threading.Timer(Tick_tick,null,10000,20000);//10秒后开始计时,20秒后调用Tick_tick事件。
特点:多线程计时器,精确,而且可扩展性强。
三.System.Timers.Timer
在Reflector里反射出来的源代码:

public Timer();
public Timer(double interval);
public void BeginInit();
public void Close();
protected override void Dispose(bool disposing);
public void EndInit();
[SuppressUnmanagedCodeSecurity, DllImport("kernel32.dll")]
internal static extern void GetSystemTimeAsFileTime(ref FILE_TIME lpSystemTimeAsFileTime);
private void MyTimerCallback(object state);
public void Start();
public void Stop();
private void UpdateTimer(); // Properties
[Category("Behavior"), TimersDescription("TimerAutoReset"), DefaultValue(true)]
public bool AutoReset { get; set; }
[Category("Behavior"), TimersDescription("TimerEnabled"), DefaultValue(false)]
public bool Enabled { get; set; }
[Category("Behavior"), TimersDescription("TimerInterval"), DefaultValue((double) 100.0), SettingsBindable(true)]
public double Interval { get; set; }
public override ISite Site { get; set; }
[Browsable(false), DefaultValue((string) null), TimersDescription("TimerSynchronizingObject")]
public ISynchronizeInvoke SynchronizingObject { get; set; }

BeginInit(),初始化。
AutoReset,只执行一次或重复执行。
enabled,获取或设置一个值,该值指示 Timer 是否应引发 Elapsed 事件。
Interval,相应间隔时间。
Elapsed绑定响应事件。
例:

public MainWindow()
{
InitializeComponent();
System.Timers.Timer timer = new System.Timers.Timer();
timer.AutoReset = true;
timer.Enabled = true;
timer.Interval=10000;
timer.Elapsed += timer_Elapsed;
timer.Start();
} void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show("响应事件");
}

特点:相对System.Threading.Timer进行了简单包装。多线程计时器
实现了Component,所以可以在设计器显示。代替Change方法的一个Interval属性代替callback委托的一个Elapsed事件启动和停止timer的Enabled属性,默认是false。
为了避免Enabled造成混乱,提供了Start和Stop方法。是否在每次指定的间隔结束时引发Elapsed时间,还是仅间隔第一次结束后运行的AutoReset属性。
四.差异
(1)上述两个Timer都是多线程计时器。Timer每到间隔时间后就会激发响应事件,因此要申请线程来执行对应的响应函数,Timer将获取线程的工作都交给了线程池来管理,
每到一定的时间后它就去告诉线程池:“我现在激发了个事件要运行对应的响应函数,麻烦你给我向操作系统要个线程,申请交给你了,线程分配下来了你就运行我给你的响应函数,
没分配下来先让响应函数在这儿排队(操作系统线程等待队列)”,消息已经传递给线程池了,Timer也就不管了,因为它还有其他的事要做(每隔一段时间它又要激发事件),
至于提交的请求什么时候能够得到满足,要看线程池当前的状态,如果线程满了就排队,在有空线程时就会响应函数。否则就直接响应。
(2)而下述两个是单线程计时器,其工作机制也和上面不同。计时器使用消息循环机制来取代线程池产生消息的机制。
这意味着Tick事件总是在创建timer的那个线程上执行,同时也意味着如果上一个Tick消息还未被处理,即使时间超过了间隔时间,在消息循环中也只存在一个Tick消息。
下面是它们的优点:
你可以忘记线程安全。一个Tick事件在前一个Tick事件被处理完毕前不会被触发。你可以直接在Tick事件处理代码中更新控件,不需要调用Control.Invoke或Dispatcher.Invoke.
五.System.Windows.Forms.Timer
专门适用于WindowForm,单线程使用。由于单线程计时器基于Windows消息循环,应用程序会同步的处理计时器的消息。UI界面会相对响应速度很慢。
WinForm不常用,就不写了。
六.System.Windows.Threading.DispatcherTimer
Reflector的源代码方法

public DispatcherTimer();
public DispatcherTimer(DispatcherPriority priority);
public DispatcherTimer(DispatcherPriority priority, Dispatcher dispatcher);
public DispatcherTimer(TimeSpan interval, DispatcherPriority priority, EventHandler callback, Dispatcher dispatcher);
private object FireTick(object unused);
private void Initialize(Dispatcher dispatcher, DispatcherPriority priority, TimeSpan interval);
internal void Promote();
private void Restart();
public void Start();
public void Stop(); // Properties
public Dispatcher Dispatcher { get; }
public TimeSpan Interval { get; set; }
public bool IsEnabled { get; set; }
public object Tag { get; set; }
}

类似于System.Threading.Timer
例:

public MainWindow()
{
InitializeComponent(); Timer.Interval = TimeSpan.FromSeconds(1000);
Timer.IsEnabled = true;
Timer.Tick += Timer_Tick; } void Timer_Tick(object sender, EventArgs e)
{
throw new NotImplementedException();
}
private DispatcherTimer Timer;

C#的四种Timer介绍的更多相关文章
- mysql进阶(六)模糊查询的四种用法介绍
mysql中模糊查询的四种用法介绍 这篇文章主要介绍了mysql中模糊查询的四种用法,需要的朋友可以参考下. 下面介绍mysql中模糊查询的四种用法: 1 %: 表示任意0个或多个字符.可匹配任意类型 ...
- Netty之WebSocket和四种IO介绍
Netty简介 一.什么是netty? 高性能 事件驱动 异步非堵塞 基于NIO的客户端,服务器端编程框架 稳定性和伸缩性 二.Netty的使用场景 高性能领域 多线程并发领域 异步通信领域 ...
- mysql中模糊查询的四种用法介绍
下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...
- 快速掌握RabbitMQ(二)——四种Exchange介绍及代码演示
在上一篇的最后,编写了一个C#驱动RabbitMQ的简单栗子,了解了C#驱动RabbitMQ的基本用法.本章介绍RabbitMQ的四种Exchange及各种Exchange的使用场景. 1 direc ...
- Rational Rose的四种视图介绍
Rose模型中有四种视图:Use Case View(用例视图),Logical View(逻辑视图),Component View(组建视图)和Deployment View(配置视图). 用例视图 ...
- Java 四种引用介绍及使用场景
强引用-FinalReference 介绍: 强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收,使用方式: String str = new String("s ...
- 四种Timer的区别和用法
1.System.Threading.Timer 线程计时器 1.最底层.轻量级的计时器.基于线程池实现的,工作在辅助线程. 2.它并不是内在线程安全的,并且使用起来比其他计时器更麻烦.此计时器通常不 ...
- PS中抠图的四种方法介绍
工具/原料 photoshop 软件(我用的是photoshop cc) 需要抠图的图片 开始的步骤 打开ps 打开图片,ctrl+O 魔棒抠图法 对于前景和后景有明显差别的图片用魔棒抠图法抠图比较容 ...
- RabbitMq四种模式介绍和授权
rabbitmqctl change_password admin admin123 修改admin密码 界面管理和授权操作 1新增用户 rabbitmqctl add_user admin amin ...
随机推荐
- java字典序排序
import java.util.Comparator; import java.util.ArrayList; import java.util.Collections; public class ...
- Design and Analysis of Algorithms_Brute Froce
I collect and make up this pseudocode from the book: <<Introduction to the Design and Analysis ...
- XPath Axes(轴)
XML 实例文档 我们将在下面的例子中使用此 XML 文档: <?xml version="1.0" encoding="ISO-8859-1"?> ...
- OpenERP 使用与开发笔记(一)
一直关注OpenERP,但一直未真正使用.最近一些数据想规范管理,免得使和EXCEL与WORD等到处找,所以想到OpenERP的自定义功能比较好,就再次找来相关资料重新拾掇起来.在这过程中,发现了许多 ...
- SQLServer中系统存储过程sp_spaceused
sp_spaceused 执行sp_spaceused存储过程的时候可以不用带参数,直接执行,或者exec sp_spaceused都可以,返回两个结果集: 列名 数据类型 描述 database_n ...
- hdu 2037 今年暑假不AC
今年暑假不AC Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数014,tuple,元组
<zw版·Halcon-delphi系列原创教程> Halcon分类函数014,tuple,元组 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...
- linux虚拟机上不了网--桥接方式--问题一直未解决
转载的:可是自己的虚拟机就是上不了网,无线网卡该配的也配了还是不行,如果真有台物理机器就行了,省了好多事:但是模拟性能时肯定不行了:有人知道是什么原因不? 虚拟机网络模式 无论是vmware,virt ...
- Openstack的nova-network的vlan模式扩展
openstack的nova-network的vlan模式是可以在安装的时候,将网络划分为多个子网,每个项目一个或者多个子网进行虚拟机创建.但是他现在代码级别上不支持:如果一开始安装的环境的vlan网 ...
- 被碾压过得Samsung SCH-W319 的取证恢复
2015年2月笔者接到一台! 被车轧过的手机Samsung SCH-W319,要求恢复 如图,显示屏被轧过,屏弯掉了 电池亦无,目前打不开!如下图: 配好电池后是这个样子,终于可以获得镜像dump 而 ...