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实现选择排序
选择排序思想就是选出最小或最大的数与第一个数交换,然后在剩下的数列中重复完成该动作. package Sort; import java.util.Arrays; public class Selec ...
- Error : should use android:showAsAction when not using support library
我有一个ListActivity,然后一个menu/options.xml android:showAsAction报错: should use android:showAsAction when n ...
- 安装ionic出现node-sass无法下载的解决方法
解决方法: 修改C:\users\[用户名]下的.npmrc文件: registry=https://registry.npm.taobao.org sass-binary-site=https:// ...
- iOS10 - 访问系统通讯录新方法
所需框架 #import <ContactsUI/ContactsUI.h> 遵循代理 CNContactPickerDelegate 调用通讯录 如果在iOS10的机器上调用以前的ABP ...
- JQuery DOM clone(true),对于克隆对象事件触发后,处理函数中this指代克隆对象
<!doctype html> <html ng-app> <head> <script src="./jquery.js">< ...
- Django知识(二)
上一部链接 django入门全套(第一部) 本章内容 Django model Model 基础配置 django默认支持sqlite,mysql, oracle,postgresql数据库. < ...
- TP框架常用配置
<?php// +----------------------------------------------------------------------// | ThinkPHP [ WE ...
- python3爬取网页
爬虫 python3爬取网页资源方式(1.最简单: import'http://www.baidu.com/'print2.通过request import'http://www.baidu.com' ...
- html5 离线存储
在html页面中引入manifest文件 <html manifest="sample.appcache"> 在服务器添加mime-type text/cache-ma ...
- CEGUI0.8.4例子
#define GLUT_DISABLE_ATEXIT_HACK#pragma comment(lib,"glew32.lib")#include<stdlib.h># ...