将Timer与DispatcherTimer进行比较

par*_*oir 97 c# timer

是什么区别between System.Windows.Forms.Timer()System.Windows.Threading.DispatcherTimer()?在哪些情况下,我们应该使用它们?任何最佳做法?

Ree*_*sey 111

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

DispatcherTimer是WPF计时机制.当你想以类似的方式处理时序时应该使用它(虽然这不仅限于一个线程 - 每个线程都有自己的调度程序)并且你正在使用WPF.它在与Dispatcher相同的线程上触发事件.

一般来说,WPF == DispatcherTimerWindows Forms == Forms.Timer.

话虽如此,还有System.Threading.Timer一个计时器class可以在一个单独的线程上触发.这对纯粹的数字计时有好处,你不会尝试更新UI等.

  • 这取决于你想要做什么.我很少使用System.Threading.Timer - 我通常会坚持使用Dispatcher Timer,然后使用类似BackgroundWorker之类的东西在另一个线程中执行你的工作(可以阻止你的UI).定时器真的不应该阻止你的UI,除非你在他们的事件处理程序中做"太多"工作. (3认同)
  • 确保正确设置了interval属性.不要这样做:timer1.Interval = new TimeSpan(1000); //"1000"表示刻度而不是毫秒!CPU是超高的,直到我用它更正它:timer1.Interval = System.TimeSpan.FromSeconds(1); (3认同)

See*_*eer 5

我在这里找到了关于计时器的好文章和小例子: http ://www.progware.org/Blog/post/Timers-in-WPF.aspx

作为结论:

如果 DoSomething() 操作 GUI 组件,那么您需要使用 Timer: this.Dispatcher.Invoke((Action)delegate { //GUI RELATED CODE HERE} 因为您无法直接从不同的线程访问 GUI 控件。使用 DispatcherTimer 您可以这样做不需要这样做。

如果 DoSomething() 执行一项耗时的任务,则在使用 DispatcherTimer 的情况下 GUI 将冻结。对于计时器,它不会,因为长方法是在不同的线程中执行的