比较 Timer 和 DispatcherTimer
Posted
技术标签:
【中文标题】比较 Timer 和 DispatcherTimer【英文标题】:Comparing Timer with DispatcherTimer 【发布时间】:2010-11-09 20:16:37 【问题描述】:between System.Windows.Forms.Timer()
和 System.Windows.Threading.DispatcherTimer()
有什么区别?在哪些情况下,我们应该使用它们?有什么最佳做法吗?
【问题讨论】:
【参考方案1】:Windows.Forms.Timer
使用 Windows 窗体消息循环来处理计时器事件。它应该在编写正在 Windows 窗体应用程序中使用的计时事件时使用,并且您希望计时器在主 UI 线程上触发。
DispatcherTimer
是 WPF 计时机制。当您想以类似的方式处理计时(尽管这不限于单个线程 - 每个线程都有自己的调度程序)并且您正在使用 WPF 时,应该使用它。它在与 Dispatcher 相同的线程上触发事件。
一般来说,WPF == DispatcherTimer
和 Windows Forms == Forms.Timer
。
话虽如此,还有System.Threading.Timer
,这是一个在单独线程上触发的计时器class
。这适用于纯数字计时,您不会尝试更新 UI 等。
【讨论】:
感谢您的及时回复。所以这意味着,每当我想要一个与 UI 相关的计时器时,我应该使用 DispatcherTimer,而当我想触发一个我不想冻结 UL 的计时器时,我应该单独使用 System.Threading.Timer线。第二个问题是:如果我想使用 DispatcherTimer,并且我希望有一个不绑定到 UI 的计时器,我应该使用 System.Threading.Timer 在单独的线程中调用它还是仍然使用 DisptacherTimer? 这取决于你想要做什么。我很少使用 System.Threading.Timer - 我通常会坚持使用 Dispatcher Timer,然后使用 BackgroundWorker 之类的东西在另一个线程中执行您的工作(这可能会阻止您的 UI)。计时器真的不应该阻塞你的 UI,除非你在他们的事件处理程序中做了“太多”的工作。 我遇到了 DispatcherTimer 随时间耗尽处理器的问题。有什么好办法处理吗? 查看具体是什么占用了 CPU。您是否创建了很多计时器,但没有被停止? 确保正确设置了间隔属性。不要这样做: timer1.Interval = new TimeSpan(1000); // "1000" 代表滴答而不是毫秒! CPU 非常高,直到我用这个纠正它: timer1.Interval = System.TimeSpan.FromSeconds(1);【参考方案2】:我在这里找到了关于计时器的好文章,并附有小例子: 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 将冻结。在 Timer 的情况下它不会因为 long 方法是在不同的线程中执行的
【讨论】:
操作!真可惜。此答案的链接已损坏。这也可能有帮助 --> wpf-tutorial.com/misc/dispatchertimer以上是关于比较 Timer 和 DispatcherTimer的主要内容,如果未能解决你的问题,请参考以下文章