timer.Interval = 5000;
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
"timer_Tick“方法是在新的线程中启动,还是仍然在创建它的线程中?
发布于 2011-03-05 16:08:12
不,计时器在创建它的线程中运行。
我假设您谈论的是System.Windows.Forms.Timer
,它是使用线程消息循环实现的。WinForms定时器的底层是Win32 API SetTimer()
,它通过将WM_TIMER
消息发布到SetTimer()
线程的消息队列来操作。
这样做的后果之一是,如果事件处理程序花费的时间比计时器间隔更长,则计时器将不会在所需的时间间隔内触发。如果这是一个问题,那么你需要把你的计时器放在另一个线程中。
作为一个思维实验,想象一下,如果您的计时器事件在不同的线程中执行,会发生什么。现在你有一个同步问题要处理了。您的计时器事件可能希望访问另一个线程中的对象。但这样做将导致竞争条件。
发布于 2011-03-05 16:24:03
计时器并不是真正的“运行”。也就是说,当您启动计时器时,操作系统会创建一些数据结构,告诉它定期发出"tick“--在您指定的任何时间段。但它不像是定时器坐在那里旋转,在等待适当的时间时消耗CPU资源。所有.NET计时器类型和Windows API计时器类型都是这样工作的。
不同之处在于,当需要打勾的时候,会发生什么。正如@David Hefferman指出的那样,使用System.Windows.Forms.Timer
时,在创建计时器的同一线程上调用Elapsed
事件处理程序。System.Threading.Timer
在线程池线程上调用它的回调。在幕后,在池线程上调用System.Timers.Timer
,但您可以使用SynchronizingObject
属性在UI线程或任何其他线程上引发Elapsed
事件。
https://stackoverflow.com/questions/5204958
复制相似问题