使用Timer和DispatcherTimer的比较

102

System.Windows.Forms.Timer()System.Windows.Threading.DispatcherTimer() 的区别是什么?在哪些情况下我们应该使用它们?有什么最佳实践吗?

2个回答

117

Windows.Forms.Timer 使用 Windows Forms 消息循环来处理定时器事件。它适用于编写在 Windows Forms 应用程序中使用的计时事件,并且您希望定时器在主 UI 线程上触发。

DispatcherTimer 是 WPF 的定时机制。它适用于您希望以类似的方式处理计时(尽管不限于单个线程 - 每个线程都有自己的调度程序)并且正在使用 WPF。它会在与 Dispatcher 相同的线程上触发事件。

总的来说,WPF == DispatcherTimer and Windows Forms == Forms.Timer

话虽如此,还有一个名为System.Threading.Timer的计时器类,可以在单独的线程上触发。这适用于纯数字计时,在这种情况下您不需要更新 UI 等。


1
感谢您的迅速回复。这意味着,每当我想要一个与UI相关的定时器时,我应该使用DispatcherTimer,而当我想要触发一个不想冻结UI的计时器时,我应该在单独的线程中使用System.Threading.Timer。第二个问题是:如果我想使用DispatcherTimer,并且我想要一个不绑定到UI的计时器,那么我应该通过使用System.Threading.Timer在单独的线程中调用它还是仍然使用DisptacherTimer? - paradisonoir
3
这取决于你想要做什么。我很少使用System.Threading.Timer - 我通常会使用Dispatcher Timer,并在另一个线程中执行你的工作(这可能会阻塞你的UI),比如使用BackgroundWorker。计时器不应该阻塞你的UI,除非在它们的事件处理程序中执行了“太多”的工作。 - Reed Copsey
我在使用DispatcherTimer时遇到了处理器占用不断增加的问题。有没有什么好的方法来解决这个问题? - discorax
3
请确保正确设置间隔属性。不要这样做: timer1.Interval = new TimeSpan(1000);// "1000"代表的是ticks而不是毫秒!CPU使用率非常高,直到我用以下代码进行了更正: timer1.Interval = System.TimeSpan.FromSeconds(1); - Lonnie Best
我认为System.Timers.Timer比DispathcedrTimer具有更好的性能。 - NoWar
显示剩余2条评论

5
我在这里找到了一篇关于计时器的好文章,其中包含小例子: http://www.progware.org/Blog/post/Timers-in-WPF.aspx 总结如下:
如果DoSomething()操作GUI组件,则需要使用Timer:this.Dispatcher.Invoke((Action)delegate { //此处为GUI相关代码},因为您不能直接从不同的线程访问GUI控件。而DispatcherTimer则不需要。
如果DoSomething()执行耗时任务,则在使用DispatcherTimer的情况下GUI会冻结。但是,在使用Timer的情况下,由于长时间方法在不同的线程中执行,因此GUI不会冻结。

糟糕!真遗憾。此答案上的链接已损坏。这可能会有所帮助 --> https://www.wpf-tutorial.com/misc/dispatchertimer/ - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接