为什么要使用Windows.Forms.Timer?

时间:2012-10-19 15:05:41

标签: c# winforms timer

我读了这篇优秀的文章Comparing the Timer Classes in the .NET Framework Class Library并得出结论,我可以用Windows.Forms.Timer做任何事情我可以用Timers.Timer - 然后some做得更好。

因此,我想到的一个显而易见的问题是:为什么提供Windows.Forms计时器?

传统(向后兼容)支持?

其他?

6 个答案:

答案 0 :(得分:7)

Windows.Forms.Timer的主要便利之处在于它的事件是在UI(Winforms)线程上触发的。如果您的计时器事件执行UI操作,它可能是最简单的替代方案(而不是在您的所有事件中调用Control.Invoke/BeginInvokeSynchronizationContext.Post/Send)。

答案 1 :(得分:6)

在UI线程上调用Windows.Forms.Timer事件,以便您可以直接从事件处理程序更新UI,Timers.Timer通常不会这样(因为您会遇到跨线程访问冲突异常) )。

而且,正如@Robert Harvey answered,它也有设计师的支持。

答案 2 :(得分:6)

Windows.Forms的一个优点是它在GUI的同一个线程中运行,并且在访问Form控件时不会出现跨线程异常。

答案 3 :(得分:5)

Windows.Forms.Timer有设计师支持。因此它的行为与任何其他Winforms组件一样(即您可以将其拖到窗体上,它是Controls集合的一部分等)。

System.Windows.Forms.Timer类引发的计时器事件与Windows窗体应用程序中的其余代码是同步的。这意味着正在执行的应用程序代码永远不会被此计时器类的实例抢占(假设您不调用Application.DoEvents)。 Windows.Forms.Timer类触发的事件与Winform控件兼容;您可以安全地与他们互动,而无需致电Invoke()

System.Timers.Timer类是基于服务器的计时器,专为在多线程环境中使用而设计和优化。可以从多个线程安全地访问此计时器类的实例。虽然技术上需要Invoke()与Winforms进行交互,但Timer类确实提供了SynchronizingObject属性,您可以附加要与其进行安全交互的Windows窗体。

更多信息: http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

答案 4 :(得分:3)

我认为答案是他们是两种完全不同的计时器。 Windows.Forms.Timer是一个单线程应用程序计时器,非常适合运行应用程序的客户端上存在的计时器。

  

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

相比之下,Timers.Timer是一个基于服务器的计时器,更适合Windows服务。

  

Timer组件是一个基于服务器的计时器,它允许您指定在应用程序中引发Elapsed事件的重复间隔。然后,您可以处理此事件以提供常规处理。例如,假设您有一台必须每周7天,每天24小时运行的关键服务器。您可以创建一个使用Timer定期检查服务器并确保系统已启动并运行的服务。如果系统没有响应,则服务可能会尝试重新启动服务器或通知管理员。

您可以在Microsoft找到他们的文档并阅读摘录等内容。

并不是永远不应该使用或永远使用,服务有两个不同的目的。

答案 5 :(得分:0)

我认为它适用于winform设计器集成,因为您可以将其拖到表单上,单击它并在属性窗格中设置其属性。