我有一个创建表单对象的主线程,该对象创建并设置一个计时器,以每分钟运行一个名为updateStatus()的函数。但是,我不清楚它是否会导致任何同步问题。C#中的System.Windows.Forms.Timer是否在主线程之外的其他线程上运行?
qyuhtwio1#
否,计时器事件在UI线程上引发。您将不会有任何同步问题。这是在WinForms应用程序中使用的计时器控件的正确版本;它是专门为完成您的要求而设计的。它是使用标准的Windows timer在底层实现的。documentation在“备注”部分对此进行了确认:计时器用于按用户定义得时间间隔引发事件.此Windows计时器是为单线程环境设计得,在该环境中,UI线程用于执行处理.它要求用户代码具有可用得UI消息泵,并且始终从同一线程操作,或者将调用封送到另一个线程.当您使用这个计时器时,请使用Tick事件来执行轮询作业,或在指定的时间内显示初始画面。只要Enabled属性设定为true,而且Interval属性大于零,就会根据Interval属性设定的间隔引发Tick事件。
axzmvihb2#
不,计时器的Tick事件是在收到WM_TIMER消息时由消息循环从UI线程引发的。您总是很擅长这样做,它只能在UI线程空闲时运行。
ql3eal8s3#
不,不,不窗体计时器的全部意义在于它运行在GUI线程上。Windows(WinForms)运行一种称为MessagePump的东西(请参阅Application.Run()),这就是使计时器成为可能的原因。您的所有代码以某种方式作为Eventhandler的一部分运行,并且Timer tick永远不会“中断”任何其他事件处理程序。
Application.Run()
smtd7mpg4#
Windows.Forms计时器可能通过同步上下文在UI线程上引发事件。如果你想要一个非UI线程,还有其他的计时器-例如System.Timers.Timer或System.Threading.Timer
b5lpy0ml5#
根据documentation,它运行在主UI线程上:计时器用于按用户定义得时间间隔引发事件.此Windows计时器是为单线程环境设计得,在该环境中,UI线程用于执行处理.它要求用户代码具有可用得UI消息泵,并且始终从同一线程操作,或者将调用封送到另一个线程.
nkhmeac66#
我不想弹劾别人的声誉如何已经回答了,那***Windows.Forms.Timer确实总是运行在GUI线程***上,但我必须反驳.:)我会回答-这取决于情况。有可能,Windows.Forms.Timer确实在非GUI线程上运行!Windows.Forms.Timer确实会在线程上激发它的Timer.Tick事件,其中已经创建了包含计时器的Form。如果表单在GUI线程上创建,则Timer.Tick在GUI线程上运行,但是如果Form在线程池中的某个线程XXX上创建(应避免),则Timer.Tick在该XXX线程上运行。
Windows.Forms.Timer
Timer.Tick
Form
Task.Run(()=> { using (var formWithTimer = new SomeFormWithTimer()) //Form created on worker thread, Tick handled on it. { formWithTimer.ShowDialog(); } });
6条答案
按热度按时间qyuhtwio1#
否,计时器事件在UI线程上引发。
您将不会有任何同步问题。这是在WinForms应用程序中使用的计时器控件的正确版本;它是专门为完成您的要求而设计的。它是使用标准的Windows timer在底层实现的。
documentation在“备注”部分对此进行了确认:
计时器用于按用户定义得时间间隔引发事件.此Windows计时器是为单线程环境设计得,在该环境中,UI线程用于执行处理.它要求用户代码具有可用得UI消息泵,并且始终从同一线程操作,或者将调用封送到另一个线程.
当您使用这个计时器时,请使用Tick事件来执行轮询作业,或在指定的时间内显示初始画面。只要Enabled属性设定为true,而且Interval属性大于零,就会根据Interval属性设定的间隔引发Tick事件。
axzmvihb2#
不,计时器的Tick事件是在收到WM_TIMER消息时由消息循环从UI线程引发的。您总是很擅长这样做,它只能在UI线程空闲时运行。
ql3eal8s3#
不,不,不
窗体计时器的全部意义在于它运行在GUI线程上。
Windows(WinForms)运行一种称为MessagePump的东西(请参阅
Application.Run()
),这就是使计时器成为可能的原因。您的所有代码以某种方式作为Eventhandler的一部分运行,并且Timer tick永远不会“中断”任何其他事件处理程序。
smtd7mpg4#
Windows.Forms计时器可能通过同步上下文在UI线程上引发事件。
如果你想要一个非UI线程,还有其他的计时器-例如System.Timers.Timer或System.Threading.Timer
b5lpy0ml5#
根据documentation,它运行在主UI线程上:
计时器用于按用户定义得时间间隔引发事件.此Windows计时器是为单线程环境设计得,在该环境中,UI线程用于执行处理.它要求用户代码具有可用得UI消息泵,并且始终从同一线程操作,或者将调用封送到另一个线程.
nkhmeac66#
我不想弹劾别人的声誉如何已经回答了,那***
Windows.Forms.Timer
确实总是运行在GUI线程***上,但我必须反驳.:)我会回答-这取决于情况。有可能,
Windows.Forms.Timer
确实在非GUI线程上运行!Windows.Forms.Timer
确实会在线程上激发它的Timer.Tick
事件,其中已经创建了包含计时器的Form
。如果表单在GUI线程上创建,则
Timer.Tick
在GUI线程上运行,但是如果Form
在线程池中的某个线程XXX上创建(应避免),则Timer.Tick
在该XXX线程上运行。