我有一个主线程创建一个表单对象,它创建并设置一个计时器,每分钟运行一个名为updateStatus()的函数。但是,主线程也会在几个地方调用updateStatus()。
但是,我不清楚它是否会导致任何同步问题。 C#中的System.Windows.Forms.Timer是否在主线程以外的其他线程上运行?
答案 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消息泵可用 并始终以相同的方式运作 线程,或编组调用 另一个线程。