一.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介绍的更多相关文章

  1. mysql进阶(六)模糊查询的四种用法介绍

    mysql中模糊查询的四种用法介绍 这篇文章主要介绍了mysql中模糊查询的四种用法,需要的朋友可以参考下. 下面介绍mysql中模糊查询的四种用法: 1 %: 表示任意0个或多个字符.可匹配任意类型 ...

  2. Netty之WebSocket和四种IO介绍

    Netty简介 一.什么是netty? 高性能 事件驱动 异步非堵塞 基于NIO的客户端,服务器端编程框架 稳定性和伸缩性 二.Netty的使用场景 高性能领域   多线程并发领域   异步通信领域 ...

  3. mysql中模糊查询的四种用法介绍

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...

  4. 快速掌握RabbitMQ(二)——四种Exchange介绍及代码演示

    在上一篇的最后,编写了一个C#驱动RabbitMQ的简单栗子,了解了C#驱动RabbitMQ的基本用法.本章介绍RabbitMQ的四种Exchange及各种Exchange的使用场景. 1 direc ...

  5. Rational Rose的四种视图介绍

    Rose模型中有四种视图:Use Case View(用例视图),Logical View(逻辑视图),Component View(组建视图)和Deployment View(配置视图). 用例视图 ...

  6. Java 四种引用介绍及使用场景

    强引用-FinalReference 介绍: 强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收,使用方式: String str = new String("s ...

  7. 四种Timer的区别和用法

    1.System.Threading.Timer 线程计时器 1.最底层.轻量级的计时器.基于线程池实现的,工作在辅助线程. 2.它并不是内在线程安全的,并且使用起来比其他计时器更麻烦.此计时器通常不 ...

  8. PS中抠图的四种方法介绍

    工具/原料 photoshop 软件(我用的是photoshop cc) 需要抠图的图片 开始的步骤 打开ps 打开图片,ctrl+O 魔棒抠图法 对于前景和后景有明显差别的图片用魔棒抠图法抠图比较容 ...

  9. RabbitMq四种模式介绍和授权

    rabbitmqctl change_password admin admin123 修改admin密码 界面管理和授权操作 1新增用户 rabbitmqctl add_user admin amin ...

随机推荐

  1. Java实现选择排序

    选择排序思想就是选出最小或最大的数与第一个数交换,然后在剩下的数列中重复完成该动作. package Sort; import java.util.Arrays; public class Selec ...

  2. Error : should use android:showAsAction when not using support library

    我有一个ListActivity,然后一个menu/options.xml android:showAsAction报错: should use android:showAsAction when n ...

  3. 安装ionic出现node-sass无法下载的解决方法

    解决方法: 修改C:\users\[用户名]下的.npmrc文件: registry=https://registry.npm.taobao.org sass-binary-site=https:// ...

  4. iOS10 - 访问系统通讯录新方法

    所需框架 #import <ContactsUI/ContactsUI.h> 遵循代理 CNContactPickerDelegate 调用通讯录 如果在iOS10的机器上调用以前的ABP ...

  5. JQuery DOM clone(true),对于克隆对象事件触发后,处理函数中this指代克隆对象

    <!doctype html> <html ng-app> <head> <script src="./jquery.js">< ...

  6. Django知识(二)

    上一部链接 django入门全套(第一部) 本章内容 Django model Model 基础配置 django默认支持sqlite,mysql, oracle,postgresql数据库. < ...

  7. TP框架常用配置

    <?php// +----------------------------------------------------------------------// | ThinkPHP [ WE ...

  8. python3爬取网页

    爬虫 python3爬取网页资源方式(1.最简单: import'http://www.baidu.com/'print2.通过request import'http://www.baidu.com' ...

  9. html5 离线存储

    在html页面中引入manifest文件 <html manifest="sample.appcache"> 在服务器添加mime-type text/cache-ma ...

  10. CEGUI0.8.4例子

    #define GLUT_DISABLE_ATEXIT_HACK#pragma comment(lib,"glew32.lib")#include<stdlib.h># ...