C#的Timer控件的Tick事件是否一个异步(多线程)委托调用

love31661988 2013-04-25 02:05:57

private void timer1_Tick(object sender, EventArgs e)
{
//假如这有一堆无意义的代码(假如变态的循环)
}
我想问,如果Interval时间过了,但事件处理程序里的代码没有执行完,此Tick事件是否会异步调用另一个新的事件处理程序,Tick事件是多线程执行吗?
...全文
3503 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zlbcdn 2014-08-06
  • 打赏
  • 举报
回复
Timer是单线程组件,其不会创建新线程,Tick事件是在由UI主线程触发,即,Tick事件相当于winform界面中的一个事件。 因此在Tick事件未处理完成之前,对界面的任何操作(或Timer的再次操作)都会引起界面的卡顿(因为需要等待未完成的事件完成) 参见MSDN: This Windows timer is designed for a single-threaded environment where UI threads are used to perform processing. 因此,楼主的卡顿的问题可以采用: 1、尽量控制方法不复杂,并保证在规定时间内完成 2、使用其他线程(Timers/Threading中)的Timer
游戏人间 2013-04-26
  • 打赏
  • 举报
回复
注意Interval这个时间单位哦。 1000才是一秒钟。 别设个1那你程不卡才怪。
leafmao 2013-04-26
  • 打赏
  • 举报
回复
引用 8 楼 love31661988 的回复:
[quote=引用 7 楼 leafmao 的回复:] LZ是希望达到什么效果呢? 如果Interval时间过了,但事件处理程序里的代码没有执行完,LZ希望再次调用事件处理还是等执行完再处理? 如果是程序代码没执行完,希望再次调用事件处理程序的话,用System.Timers名称空间下的Timer,这个是多线程的
我想我的界面不阻塞, DispatcherTimer timer = new DispatcherTimer(); timer.Tick += new EventHandler(this.OnTimerTick); timer.Interval = TimeSpan.FromSeconds(1); timer.Start(); 绑定的事件执行超过1S,但是1S的时间最好不要改变,现在再尝试3楼的方法,希望帮助[/quote] 不了解DispatcherTimer 界面阻塞?是不是tick里的代码有问题额
love31661988 2013-04-26
  • 打赏
  • 举报
回复
引用 7 楼 leafmao 的回复:
LZ是希望达到什么效果呢? 如果Interval时间过了,但事件处理程序里的代码没有执行完,LZ希望再次调用事件处理还是等执行完再处理? 如果是程序代码没执行完,希望再次调用事件处理程序的话,用System.Timers名称空间下的Timer,这个是多线程的
我想我的界面不阻塞, DispatcherTimer timer = new DispatcherTimer(); timer.Tick += new EventHandler(this.OnTimerTick); timer.Interval = TimeSpan.FromSeconds(1); timer.Start(); 绑定的事件执行超过1S,但是1S的时间最好不要改变,现在再尝试3楼的方法,希望帮助
leafmao 2013-04-26
  • 打赏
  • 举报
回复
LZ是希望达到什么效果呢? 如果Interval时间过了,但事件处理程序里的代码没有执行完,LZ希望再次调用事件处理还是等执行完再处理? 如果是程序代码没执行完,希望再次调用事件处理程序的话,用System.Timers名称空间下的Timer,这个是多线程的
love31661988 2013-04-26
  • 打赏
  • 举报
回复
引用 5 楼 wonderfuly 的回复:
注意Interval这个时间单位哦。 1000才是一秒钟。 别设个1那你程不卡才怪。
不会..
qldsrx 2013-04-25
  • 打赏
  • 举报
回复
阻塞是肯定会有的,因为那个Tick事件是在控件所在线程上执行的,这个我2楼也说过的,你没仔细看。那个定时器在计时时用的是其它线程,但是到了触发定时事件时,却会委托回调到当前控件所在线程,如果那个操作很耗时,自然会卡界面了。 如果你的Tick事件中处理的逻辑和界面完全无关,那么建议使用System.Threading.Timer类,那个不会阻塞当前线程,计时和触发定时都用的其它线程在执行。
love31661988 2013-04-25
  • 打赏
  • 举报
回复
引用 2 楼 qldsrx 的回复:
你这个是System.Windows.Forms.Timer,该控件是异步执行的,如果时间到了,引发的事件会被异步委托回调到控件所在线程上执行,因为是异步的,所以不管上次是否执行完毕,当前的仍旧会被排队等待执行。因此使用这类控件,最好在timer1_Tick里面一开始就添加Stop代码,将计时器停止计时,待处理完毕后使用Start开启即使,也就是事件处理过程不包含在计时中……
已经按你说的我操作了,并且我把timer,enable设为false了,下面也放开了,可还有阻塞,Interval设为1S,这个是不能改变的,还有什么其他的法子吗?
qldsrx 2013-04-25
  • 打赏
  • 举报
回复
你这个是System.Windows.Forms.Timer,该控件是异步执行的,如果时间到了,引发的事件会被异步委托回调到控件所在线程上执行,因为是异步的,所以不管上次是否执行完毕,当前的仍旧会被排队等待执行。因此使用这类控件,最好在timer1_Tick里面一开始就添加Stop代码,将计时器停止计时,待处理完毕后使用Start开启即使,也就是事件处理过程不包含在计时中。
我要坚强 2013-04-25
  • 打赏
  • 举报
回复
Windows 窗体 Timer 组件是单线程组件,精度限定为 55 毫秒。如果您需要更高精度的多线程计时器,请使用 System.Timers 命名空间中的 Timer 类。 我的理解是 Windows 窗体 Timer 组件 当时间到了他会触发一个timer1_Tick,不过是加载在主线程上运行的,如果主线程第一个timer1_Tick 事件处理不完,你又来第二个事件,就像主线程中别的程序一样,等上一个处理完了再处理下一个或是别的在主线程中的程序或事件。 而System.Timers ,会在时间到时线程池中取一条空的线程执行你的命令,两个就两个长时间的运行会有两个Elapsed 事件调用的线程中并行或穿差进行,

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧