System.Windows.Forms.Timer和System.Timers.Timer的区别
2009-12-29 18:51
525 查看
.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失去响应。但是这里有两个地方需要注意:
因为一般来说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
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失去响应。但是这里有两个地方需要注意:
因为一般来说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.Timers.Timer和System.Windows.Forms.Timer区别-测试笔记
- System.Windows.Forms.Timer和System.Timers.Timer的区别 [转]
- System.Windows.Forms.Timer和System.Timers.Timer的区别
- System.Windows.Forms.Timer与System.Timers.Timer的区别
- System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的 区别和用法
- System.Windows.Forms.Timer与System.Timers.Timer的区别 .
- System.Windows.Forms.Timer和System.Timers.Timer的区别
- System.Windows.Forms.Timer和System.Timers.Timer的区别 [转]
- System.Windows.Forms.Timer与System.Timers.Timer的区别
- System.Windows.Forms.Timer与System.Timers.Timer的区别
- System.Windows.Forms.Timer与System.Timers.Timer的区别
- System.Timers.Timer与System.Windows.Forms.Timer 区别
- System.Windows.Forms.Timer和System.Timers.Timer的区别
- System.Windows.Forms.Timer与System.Timers.Timer的区别
- System.Windows.Forms.Timer与System.Timers.Timer的区别
- System.Windows.Forms.Timer与System.Timers.Timer的区别(zz)
- System.Timers.Timer与System.Windows.Forms.Timer 区别
- 3个Timer(System.Threading.Timer,System.Windows.Forms.Timer,System.Timers.Timer)的区别
- System.Windows.Forms.Timer和System.Timers.Timer的区别 [转]
- System.Windows.Forms.Timer和System.Timers.Timer的区别 [转]