NET Framework里面提供了三种Timer:

•System.Windows.Forms.Timer
•System.Timers.Timer
•System.Threading.Timer
Visual Studio 2003的工具箱里面默认提供了System.Windows.Forms.Timer和System.Timers.Timer两种,而Visual Studio 2005中确只默认提供了System.Windows.Forms.Timer这一种。这里简单的介绍一下这三种Timer的区别。

System.Windows.Forms.Timer是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事件上的EvnetHandler。在这种Timer的EventHandler中可以直接获取和修改UI元素而不会出现问题--因为这种Timer实际上就是在UI线程自身上进行调用的。也正是因为这个原因,导致了在Timer的EventHandler里面进行长时间的阻塞调用,将会阻塞界面响应的后果。下面是一个简单的例子:

public class MainForm : Form
{
private void MainForm_Load(object sender, EventArgs e)
{
timer.Interval = 1000;
timer.Tick += delegate(object o, EventArgs args)
{
DoWork();
};
timer.Start();
}private void DoWork()
{
for (int i = 0; i < 10; i++)
{
System.Threading.Thread.Sleep(1000);
}
}
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
}

在这个例子中,DoWork方法里面将会阻塞10秒,在这10秒之内,UI将会失去响应。而通过使用System.Timers.Timer,就可以解决这个问题。因为System.Timers.Timer是在.NET的Thread Pool上面运行的,而不是直接在UI Thread上面运行,所以在这种Timer的EventHandler里面进行耗时较长的计算不会导致UI失去响应。但是这里有两个地方需要注意:

1.因为一般来说System.Timers.Timer不是运行在UI Thread上面的,所以如果要在这种Timer的EventHandler里面更新UI元素的话,需要进行一次线程切换,在WinForm开发中一般通过UI元素的Invoke方法完成:

    private void DoWork(){for (int i = 0; i < 10; i++){System.Threading.Thread.Sleep(1000);}this.Invoke(new UpdateUICallBack(UpdateUI));}private delegate void UpdateUICallBack();private void UpdateUI(){}

2.System.Timers.Timer有一个Property:SynchronizingObject 。如果设置了这个Property(一般是某个Form),那么之后对Timer挂接的EventHandler的调用将会在创建这个UI元素的线程上进行(一般来说就是UI线程)。值得注意的是,如果你通过WinForm设计器把System.Timers.Timer拖放到Form上,那么这个Property将会自动被设置。此时这种Timer就和System.Windows.Forms.Timer的效果一样:长调用将会阻塞界面。

3.   System.Threading.Timer 是一个使用回调方法的计时器,而且由线程池线程服务,简单且对资源要求不高。
            "只要在使用 Timer,就必须保留对它的引用。
            "对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。
            "当不再需要计时器时,请使用 Dispose 方法释放计时器持有的资源。

使用 TimerCallback 委托指定希望 Timer 执行的方法。计时器委托在构造计时器时指定,并且不能更改。此方法不在创建计时器的线程中执行,而是在系统提供的线程池线程中执行。

创建计时器时,可以指定在第一次执行方法之前等待的时间量(截止时间)以及此后的执行期间等待的时间量(时间周期)。可以使用 Change 方法更改这些值或禁用计时器。

Demo application:
应用场景:在windows form程序自动执行某项工作后,希望其windows form能够自动关闭。

"代码设计:

(1)首先声明Timer变量:
//一定要声明成局部变量以保持对Timer的引用,否则会被垃圾收集器回收!
private System.Threading.Timer timerClose;

(2)在上述自动执行代码后面添加如下Timer实例化代码:

// Create a timer thread and start it
timerClose = new System.Threading.Timer(new TimerCallback(timerCall), this, 5000, 0);

//Timer构造函数参数说明

Callback:一个 TimerCallback 委托,表示要执行的方法。
State:一个包含回调方法要使用的信息的对象,或者为空引用(Visual Basic 中为 Nothing)。
dueTime:调用 callback 之前延迟的时间量(以毫秒为单位)。指定 Timeout.Infinite 以防止计时器开始计时。指定零 (0) 以立即启动计时器。
Period:调用 callback 的时间间隔(以毫秒为单位)。指定 Timeout.Infinite 可以禁用定期终止。

(3)定义TimerCallback委托要执行的方法:

private void timerCall(object obj)
{timerClose.Dispose();this.Close();
}

转载于:https://www.cnblogs.com/cate-daqing/archive/2011/03/23/1992185.html

.NET Timer控件相关推荐

  1. WPF的Timer控件的使用

    原文:WPF的Timer控件的使用 通过System.Threaing.Timer控件来实现"初始加载页面时为DataGrid的模版列赋初始值" System.Threaing.T ...

  2. winform/timer控件/权限设置/三级联动

    winform/timer控件/权限设置/三级联动 一.timer控件 组件--timer timer是一个线程,默认可以跨线程访问对象 属性:Enabled--可用性 Interval--间隔时间 ...

  3. 通过timer控件和窗体的opacity属性,轻松实现窗体的淡入淡出

    窗体加载#region 窗体加载                 private void Form1_Load(object sender, EventArgs e)                 ...

  4. ASP.NET AJAX入门系列(11):在多个UpdatePanle中使用Timer控件

    本文将使用Timer控件更新两个UpdatePanel控件,Timer控件将放在UpdatePanel控件的外面,并将它配置为UpdatePanel的触发器,翻译自官方文档.<?XML:NAME ...

  5. AJAX中UPDATEPANEL配合TIMER控件实现局部无刷新

    首先加入UpdatePanel <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode= ...

  6. 使用timer控件创建一个简单的报警程序

    简介: 当我使用计算机工作时,我总是如此的专心致志,以至于每当我过了"一会儿"去看时间时,发现已经过了三个小时,而我却完全没有意识到!所以我决定使用我从Code Project学来 ...

  7. C# 使用Timer控件设置时间间隔

    Timer 控件可以定期引发事件,该控件是为 Windows 窗体环境设计的.时间间隔的长度由 Interval 属性定义,其值以毫秒为单位.若启用了该组件,则每个时间间隔引发一个 Tick 事件,在 ...

  8. 第十篇: Timer 控件

    1. 新建 Web窗体: Timer(一).aspx     添加 ScriptManager 控件,UpdatePanel 控件,Timer 控件(放在 UpdatePanel 中) 2. 把 Ti ...

  9. ASP.NET AJAX - Timer控件之摆放位置的影响

    ASP.NET AJAX所提供的 Timer 控件是一个服务器控件,它能够定时引发全网页回传,当然,在搭配了 UpdatePanel 控件之后,就可以定时引发异步回传并局部更新 UpdatePanel ...

  10. ASP.NET AJAX入门系列(10):Timer控件简单使用

    本文主要通过一个简单示例,让Web页面在一定的时间间隔内局部刷新,来学习一下ASP.NET AJAX中的服务端Timer控件的简单使用. 主要内容 Timer控件的简单使用 1.添加新页面并切换到设计 ...

最新文章

  1. 机器人~TCP/IP通信
  2. 树莓派(Raspberry Pi 3) centos7使用yum命令报错File /usr/bin/yum, line 30 except KeyboardInterrupt, e:...
  3. finished with exit code -1073740791 (0xC0000409)解决方案
  4. 【Python-ML】聚类的性能评价指标
  5. 为什么梯度反方向是函数下降最快的方向
  6. 3.2. @RestController
  7. Spring Cloud 之 Eureka.
  8. PyCharm中导入数据分析库
  9. 幸福来得快,去的也快。
  10. Centos6.4升级glibc_2.14
  11. html中免费的四级联动,四级联动.html
  12. Revit二次开发——布管系统设置
  13. java观察者模式举例
  14. 硬盘的那些事(主分区、扩展分区、逻辑分区、活动分区、系统分区、启动分区、引导扇区、MBR等
  15. RocketMq配置rocketmq-console控制台管理账号密码
  16. 霍元甲被日本人用烂肺药毒死(图)
  17. 跑道标识和那些复杂的灯光系统 and 简介、编号、参数、标志及数量 and 飞机跑道标准与参数...
  18. 树莓派开机启动python文件_树莓派开机自启动Py文件
  19. 基于STM32蓝牙控制的app智能台灯设计
  20. Oracle 查询当前用户所有表以及统计表内数据行数

热门文章

  1. 初识openwrt(上)
  2. 面向对象基础——static关键字和代码块的使用
  3. mysql安装mac 压缩包_MySQL8.0安装详解(图文版)
  4. 【kafka】WARN Attempting to send response via channel for which there is no open connection
  5. 【Flink】Flink1.12.0 FlinkSQL消费Kafka 使用 temporal join 关联维表Hive 最新分区数据 join 不上
  6. 【Flink】FLink 提交报错 instead of minReplication (=1). There are 3 datanode(s) running and 3 node(s) are
  7. 【Jvm】jvm -XX 参数 VM 调优参数
  8. 【Elasticsearch】Elasticsearch 索引策略
  9. Spark调优 shuffle调优
  10. 【Jenkins】Jenkins : Mac中Jenkins的停止和启动