System.Windows.Forms.Timer是否在与UI不同的线程上运行?

时间:2011-04-17 15:42:47

标签: c# .net winforms c#-4.0 timer

我有一个主线程创建一个表单对象,它创建并设置一个计时器,每分钟运行一个名为updateStatus()的函数。但是,主线程也会在几个地方调用updateStatus()。

但是,我不清楚它是否会导致任何同步问题。 C#中的System.Windows.Forms.Timer是否在主线程以外的其他线程上运行?

5 个答案:

答案 0 :(得分:23)

不,在UI线程上引发了计时器事件。

你不会有任何同步问题。这是在WinForms应用程序中使用的正确版本的计时器控件;它专门设计用于满足您的要求。它是使用标准Windows timer在引擎盖下实现的。

documentation在备注部分确认了这一点:

  

Timer用于以用户定义的间隔引发事件。此Windows计时器专为使用UI线程执行处理的单线程环境而设计。它要求用户代码具有可用的UI消息泵,并始终在同一个线程中运行,或者将调用编组到另一个线程上。

     

使用此计时器时,请使用Tick事件执行轮询操作或在指定的时间段内显示闪屏。只要Enabled属性设置为true且Interval属性大于零,就会根据Interval属性设置按间隔引发Tick事件。

答案 1 :(得分:9)

不,当收到WM_TIMER消息时,消息循环会从UI线程引发计时器的Tick事件。你总是很好,它只能在你的UI线程空闲时运行。

答案 2 :(得分:6)

没有

Windows.Forms Timer的重点在于它在GUI Thread上运行。

Windows(WinForms)运行一个名为MessagePump的东西(参见Application.Run()),这就是使Timer成为可能的原因。

所有代码都以某种方式作为Eventhandler的一部分运行,并且Timer tick将永远不会“中断”任何其他事件处理程序。

答案 3 :(得分:5)

Windows.Forms计时器会在UI线程上引发事件,可能是通过同步上下文。

如果您需要非UI线程,还有其他计时器 - 例如System.Timers.Timer或System.Threading.Timer

答案 4 :(得分:2)

根据它在主UI线程上运行的documentation

  

计时器用于举起活动   用户定义的间隔。这个Windows   计时器专为一个   UI的单线程环境   线程用于执行   处理。它需要用户   代码有一个UI消息泵可用   并始终以相同的方式运作   线程,或编组调用   另一个线程。