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 ...
随机推荐
- haproxy学习之https配置
haproxy学习之https配置 原文 http://www.cnblogs.com/ilanni/p/4941056.html 如何配置https,以及https在实际生产环境中的应用. ...
- noi 1.5 43:质因数分解
描述 已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数. 输入 输入只有一行,包含一个正整数 n.对于60%的数据,6 ≤ n ≤ 1000.对于100%的数据,6 ≤ n ≤ 2*10^ ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- jQuery Scroll Follow
Overview Scroll Follow is a simple jQuery plugin that enables a DOM object to follow the page as the ...
- __PUBLIC__ 路径更改
config.php 'TMPL_PARSE_STRING' => array( '__PUBLIC__' => __ROOT__ . '/' . APP_NAME . '/Tpl/Pub ...
- 基于spring+quartz的分布式定时任务框架
问题背景 我公司是一个快速发展的创业公司,目前有200人,主要业务是旅游和酒店相关的,应用迭代更新周期比较快,因此,开发人员花费了更多的时间去更=跟上迭代的步伐,而缺乏了对整个系统的把控 没有集群之前 ...
- oracle 基础
1.order by 排序 select * from dept order by desc; --降序 select ename,empno from emp order by empno asc; ...
- 8139too.c网卡驱动简单分析
从事linux C开发工作以来,工作内容主要是在应用层,对nginx和unbound等软件有些了解,也常对这2个软件进行二次开发. 对网络这块一直比较有兴趣.也很好奇网卡到底是怎么接受到报文的,以及报 ...
- zmap在阿里云主机上的编译
环境: cat /etc/issueUbuntu 14.04.2 LTS \n \l cat /proc/cpuinfoprocessor : 0vendor_id : GenuineIntelcpu ...
- 分享前端Facebook及Twitter第三方登录
最近公司要求做海外的第三方登录:目前只做了Facebook和Twitter;国内百度到的信息太少VPN FQ百度+Google了很久终于弄好了.但是做第三方登录基本上都有个特点就是引入必须的js,设置 ...