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

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

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

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

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

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

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

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

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

没有。

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

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

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

Windows.Forms计时器在UI线程上引发事件,可能是通过sync-context。

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

根据它在主UI线程上运行的文档 :

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