将计时器与DispatcherTimer进行比较


98

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

Answers:


111

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

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

通常,WPF == DispatcherTimerWindows Forms == Forms.Timer

话虽这么说,还有System.Threading.Timer一个计时器class,它在单独的线程上触发。这对于纯数字计时非常有用,您无需尝试更新UI等。


1
感谢您的及时回应。因此,这意味着,每当我想要与UI相关的计时器时,都应使用DispatcherTimer,并且当我要触发不希望冻结UL的计时器时,应在单独的位置使用System.Threading.Timer线。第二个问题是:如果我想使用DispatcherTimer,并且想要不与UI绑定的计时器,是否应该使用System.Threading.Timer或仍然使用DisptacherTimer在单独的线程中调用它?
paradisonoir

3
这取决于您要执行的操作。我很少使用System.Threading.Timer-我通常会坚持使用Dispatcher Timer,然后使用诸如BackgroundWorker之类的东西在另一个线程中进行工作(这可能会阻塞UI)。除非您在其事件处理程序中进行了“过多”的工作,否则计时器确实不应阻塞您的UI。
里德·科普西2009年

我的DispatcherTimer有问题,随着时间的流逝,处理器吃光了。有解决这个问题的好方法吗?
discorax

检查以查看到底是什么在消耗CPU。您是否正在创建很多没有停止的计时器?
里德·科普西

3
确保正确设置了interval属性。不要这样做:timer1.Interval = new TimeSpan(1000); //“ 1000”表示刻度,不是毫秒!CPU很高,直到我对此进行了纠正:timer1.Interval = System.TimeSpan.FromSeconds(1);
Lonnie Best,2010年

4

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

作为结论:

如果DoSomething()操纵了GUI组件,则需要使用Timer来使用:this.Dispatcher.Invoke((Action)delegate {// GUI RELATED CODE HERE},因为您不能直接从其他线程访问GUI控件。不需要这样做。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.