.NET Framework里面提供了三种Timer:
-
System.Windows.Forms.Timer
-
System.Timers.Timer
-
System.Threading.Timer
VS
.NET
2005默认只有一个Timer控件,但那是System.Forms.Timer控件.如果要使用System.Timers.Timer的控件,需要在工具箱上单击右键,手动添加.
添加的步骤:工具箱单击右键->Add Item->找到命名空间是System.Timers.Timer的控件,将其选中,OK即可。
这里简单的介绍一下这两种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失去响应。但是这里有两个地方需要注意:
-
因为一般来说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()
{
}
-
System.Timers.Timer有一个Property:
SynchronizingObject
。如果设置了这个Property(一般是某个Form),那么之后对Timer挂接的EventHandler的调用将会在创建这个UI元素的线程上进 行(一般来说就是UI线程)。值得注意的是,如果你通过WinForm设计器把System.Timers.Timer拖放到Form上,那么这个 Property将会自动被设置。此时这种Timer就和System.Windows.Forms.Timer的效果一样:长调用将会阻塞界面。
System.Windows.Forms.Timer
1. 它是一个基于Form的计时器
2. 创建之后,你可以使用Interval设置Tick之间的跨度,用委托(delegate)hook Tick事件
3. 调用Start和Stop方法,开始和停止
4. 完全基于UI线程,因此部分UI相关的操作会在这个计时器内进行
5. 长时间的UI操作可能导致部分Tick丢失
System.Timers.Timer
1. 用的不是Tick事件,而是Elapsed事件
2. 和System.Windows.Forms.Timer一样,用Start和Stop方法
3. AutoReset属性决定计时器是不是要发起一次事件然后停止,还是进入开始/等待的循环。System.Windows.Forms.Timer没有这个属性
4. 设置对于UI控件的同步对象(synchronizing object),对控件的UI线程发起事件
这两者与System.Threading.Timer的区别比较见
http://mark.michaelis.net/Blog/SystemWindowsFormsTimerVsSystemThreadingTimerVsSystemTimersTimer.aspx
,这里只摘录最后的总结:
System.Windows.Forms.Timer 是对于用户界面编程的比较显然的选择。而另外两个之间的选择就不是很明显。如果必须在IContainer内,那么就应该选择 System.Timers.Timer。如果没有用到System.Timers.Timer的特性,那么建议选择 System.Threading.Timer,因为它稍稍轻量级一些。
Timer 是先等待再执行,如果我们要达到先执行再等待的效果,设置 默认时间间隔Interval
=100,或者更少为1(不能为0),之后再引发事件内更改 时间间隔Interval 为想要的值。
转自:http://www.cnblogs.com/lonelyxmas/archive/2009/10/27/1590604.html
.NET Framework里面提供了三种Timer:System.Windows.Forms.TimerSystem.Timers.TimerSystem.Threading.TimerVS.NET 2005默认只有一个Timer控件,但那是System.Forms.Timer控件.如果要使用System.Timers.Timer的控件,需要在工具箱上单击
C#中
timer
类的用法关于C#中
timer
类 在C#里关于定时器类就有3个 1.定义在System.
Windows
.
Forms
里 2.定义在System.Threading.
Timer
类里 3.定义在System.
Timer
s.
Timer
类里 System.
Windows
.
Forms
.
Timer
是应用于WinForm中的,它是通过
Windows
消息机制实现的,类似于VB或Delphi中的
Timer
控件,内部使用API Set
Timer
实现的。它的主要缺点是计时不精确,而且必须有消息循环,Console Application(控制台应用程序)无法使用。 System.T
public class Class1 {
static System.
Windows
.
Forms
.
Timer
my
Timer
= new System.
Windows
.
Forms
.
Timer
();
static int alarmCounter = 1;
static bool exitFlag = false;
// This is the method to
一、主要属性、方法和事件
Windows
窗体
Timer
是定期引发事件的组件。该组件是为
Windows
窗体环境设计的。
时间间隔的长度由Interval属性定义,其值以毫秒为单位。若启用了该组件,则每个时间间隔引发一个Tick事件。
这是添加要执行的代码的位置。
Timer
组件的主要方法包括Start和Stop,这两种方法可打开和关闭计时器。计时器在关...
C# 定时器的使用 System.
Windows
.
Forms
.
Timer
,System.
Timer
s.
Timer
,System.Threading.
Timer
2:System.
Timer
s.
Timer
特殊目的的单线程计时器:
1:System.
Windows
.
Forms
.
Timer
(
Windows
Forms
Timer
)
2:System.
Windows
.Threading.Dispatcher
Timer
(WPF ti
根据msdn解释:System.Threading.
Timer
是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。
不建议将其用于
Windows
窗体,因为其回调不在用户界面线程上进行。
System.
Windows
.
Forms
.
Timer
是用于
Windows
窗体的更佳选择。
Windows
窗体
Timer
组件是单线程组件,精度限定为 55 毫秒。
如果您需要更高精...