.NET Timer控件
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控件相关推荐
- WPF的Timer控件的使用
原文:WPF的Timer控件的使用 通过System.Threaing.Timer控件来实现"初始加载页面时为DataGrid的模版列赋初始值" System.Threaing.T ...
- winform/timer控件/权限设置/三级联动
winform/timer控件/权限设置/三级联动 一.timer控件 组件--timer timer是一个线程,默认可以跨线程访问对象 属性:Enabled--可用性 Interval--间隔时间 ...
- 通过timer控件和窗体的opacity属性,轻松实现窗体的淡入淡出
窗体加载#region 窗体加载 private void Form1_Load(object sender, EventArgs e) ...
- ASP.NET AJAX入门系列(11):在多个UpdatePanle中使用Timer控件
本文将使用Timer控件更新两个UpdatePanel控件,Timer控件将放在UpdatePanel控件的外面,并将它配置为UpdatePanel的触发器,翻译自官方文档.<?XML:NAME ...
- AJAX中UPDATEPANEL配合TIMER控件实现局部无刷新
首先加入UpdatePanel <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode= ...
- 使用timer控件创建一个简单的报警程序
简介: 当我使用计算机工作时,我总是如此的专心致志,以至于每当我过了"一会儿"去看时间时,发现已经过了三个小时,而我却完全没有意识到!所以我决定使用我从Code Project学来 ...
- C# 使用Timer控件设置时间间隔
Timer 控件可以定期引发事件,该控件是为 Windows 窗体环境设计的.时间间隔的长度由 Interval 属性定义,其值以毫秒为单位.若启用了该组件,则每个时间间隔引发一个 Tick 事件,在 ...
- 第十篇: Timer 控件
1. 新建 Web窗体: Timer(一).aspx 添加 ScriptManager 控件,UpdatePanel 控件,Timer 控件(放在 UpdatePanel 中) 2. 把 Ti ...
- ASP.NET AJAX - Timer控件之摆放位置的影响
ASP.NET AJAX所提供的 Timer 控件是一个服务器控件,它能够定时引发全网页回传,当然,在搭配了 UpdatePanel 控件之后,就可以定时引发异步回传并局部更新 UpdatePanel ...
- ASP.NET AJAX入门系列(10):Timer控件简单使用
本文主要通过一个简单示例,让Web页面在一定的时间间隔内局部刷新,来学习一下ASP.NET AJAX中的服务端Timer控件的简单使用. 主要内容 Timer控件的简单使用 1.添加新页面并切换到设计 ...
最新文章
- 机器人~TCP/IP通信
- 树莓派(Raspberry Pi 3) centos7使用yum命令报错File /usr/bin/yum, line 30 except KeyboardInterrupt, e:...
- finished with exit code -1073740791 (0xC0000409)解决方案
- 【Python-ML】聚类的性能评价指标
- 为什么梯度反方向是函数下降最快的方向
- 3.2. @RestController
- Spring Cloud 之 Eureka.
- PyCharm中导入数据分析库
- 幸福来得快,去的也快。
- Centos6.4升级glibc_2.14
- html中免费的四级联动,四级联动.html
- Revit二次开发——布管系统设置
- java观察者模式举例
- 硬盘的那些事(主分区、扩展分区、逻辑分区、活动分区、系统分区、启动分区、引导扇区、MBR等
- RocketMq配置rocketmq-console控制台管理账号密码
- 霍元甲被日本人用烂肺药毒死(图)
- 跑道标识和那些复杂的灯光系统 and 简介、编号、参数、标志及数量 and 飞机跑道标准与参数...
- 树莓派开机启动python文件_树莓派开机自启动Py文件
- 基于STM32蓝牙控制的app智能台灯设计
- Oracle 查询当前用户所有表以及统计表内数据行数
热门文章
- 初识openwrt(上)
- 面向对象基础——static关键字和代码块的使用
- mysql安装mac 压缩包_MySQL8.0安装详解(图文版)
- 【kafka】WARN Attempting to send response via channel for which there is no open connection
- 【Flink】Flink1.12.0 FlinkSQL消费Kafka 使用 temporal join 关联维表Hive 最新分区数据 join 不上
- 【Flink】FLink 提交报错 instead of minReplication (=1). There are 3 datanode(s) running and 3 node(s) are
- 【Jvm】jvm -XX 参数 VM 调优参数
- 【Elasticsearch】Elasticsearch 索引策略
- Spark调优 shuffle调优
- 【Jenkins】Jenkins : Mac中Jenkins的停止和启动