比较 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 == DispatcherTimerWindows 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的主要内容,如果未能解决你的问题,请参考以下文章

Chapter6 定时器Timer_A

android alarm timer 哪个好

关于C#中的timer控件!

android中的Timer与Handler的比较

Python 线程定时器 Timer

delphi timer的用法