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

vc6uscn9  于 2022-11-17  发布在  Windows
关注(0)|答案(6)|浏览(165)

我有一个创建表单对象的主线程,该对象创建并设置一个计时器,以每分钟运行一个名为updateStatus()的函数。
但是,我不清楚它是否会导致任何同步问题。C#中的System.Windows.Forms.Timer是否在主线程之外的其他线程上运行?

qyuhtwio

qyuhtwio1#

否,计时器事件在UI线程上引发。
您将不会有任何同步问题。这是在WinForms应用程序中使用的计时器控件的正确版本;它是专门为完成您的要求而设计的。它是使用标准的Windows timer在底层实现的。
documentation在“备注”部分对此进行了确认:
计时器用于按用户定义得时间间隔引发事件.此Windows计时器是为单线程环境设计得,在该环境中,UI线程用于执行处理.它要求用户代码具有可用得UI消息泵,并且始终从同一线程操作,或者将调用封送到另一个线程.
当您使用这个计时器时,请使用Tick事件来执行轮询作业,或在指定的时间内显示初始画面。只要Enabled属性设定为true,而且Interval属性大于零,就会根据Interval属性设定的间隔引发Tick事件。

axzmvihb

axzmvihb2#

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

ql3eal8s

ql3eal8s3#

不,不,不
窗体计时器的全部意义在于它运行在GUI线程上。
Windows(WinForms)运行一种称为MessagePump的东西(请参阅Application.Run()),这就是使计时器成为可能的原因。
您的所有代码以某种方式作为Eventhandler的一部分运行,并且Timer tick永远不会“中断”任何其他事件处理程序。

smtd7mpg

smtd7mpg4#

Windows.Forms计时器可能通过同步上下文在UI线程上引发事件。
如果你想要一个非UI线程,还有其他的计时器-例如System.Timers.Timer或System.Threading.Timer

b5lpy0ml

b5lpy0ml5#

根据documentation,它运行在主UI线程上:
计时器用于按用户定义得时间间隔引发事件.此Windows计时器是为单线程环境设计得,在该环境中,UI线程用于执行处理.它要求用户代码具有可用得UI消息泵,并且始终从同一线程操作,或者将调用封送到另一个线程.

nkhmeac6

nkhmeac66#

我不想弹劾别人的声誉如何已经回答了,那***Windows.Forms.Timer确实总是运行在GUI线程***上,但我必须反驳.:)
我会回答-这取决于情况。有可能,Windows.Forms.Timer确实在非GUI线程上运行!
Windows.Forms.Timer确实会在线程上激发它的Timer.Tick事件,其中已经创建了包含计时器的Form
如果表单在GUI线程上创建,则Timer.Tick在GUI线程上运行,但是如果Form在线程池中的某个线程XXX上创建(应避免),则Timer.Tick在该XXX线程上运行。

Task.Run(()=>
{
    using (var formWithTimer = new SomeFormWithTimer()) //Form created on worker thread, Tick handled on it.
    {
        formWithTimer.ShowDialog();
    }
});

相关问题