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

use*_*246 23 .net c# timer winforms c#-4.0

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

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

Cod*_*ray 25

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

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

文件证实了这一点备注部分:

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

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


Han*_*ant 9

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


Hen*_*man 6

没有.

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

Windows(WinForms)运行一个叫做MessagePump的东西(参见参考资料Application.Run()),这就是让Timer成为可能的原因.

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


Mar*_*ell 5

Windows.Forms计时器将事件提升回UI线程,可能是通过sync-context.

如果你想要一个非UI线程,还有其他定时器 - 例如System.Timers.Timer或System.Threading.Timer

  • 不完全的.它使用Windows消息,因此它永远不会离开UI线程. (2认同)