C# 比较计时器和分派器

C# 比较计时器和分派器,c#,timer,C#,Timer,System.Windows.Forms.Timer()和System.Windows.Threading.Dispatchermer()之间的区别是什么?在哪些情况下,我们应该使用它们?任何最佳实践?Windows.Forms.Timer使用Windows窗体消息循环来处理计时器事件。在编写Windows窗体应用程序中使用的计时事件时,应该使用它,并且您希望计时器在主UI线程上启动 Dispatchermer是WPF计时机制。当您希望以类似的方式处理计时(尽管这不限于单个线程-每个线程都有自己

System.Windows.Forms.Timer()和System.Windows.Threading.Dispatchermer()之间的区别是什么?在哪些情况下,我们应该使用它们?任何最佳实践?

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

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

通常,
WPF==DispatcherTimer
Windows窗体==Forms.Timer


也就是说,还有一个计时器
class
,它在一个单独的线程上触发。这适用于纯数字计时,您不需要尝试更新UI等。

我在这里找到了一篇关于计时器的好文章,其中有一些小例子:

作为结论:

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

如果DoSomething()执行一项耗时的任务,那么对于Dispatchermer,GUI将冻结。对于计时器,则不会冻结,因为长方法是在不同的线程中执行的


感谢您的及时回复。这意味着,每当我想要一个与UI相关的计时器时,我都应该使用Dispatcher,当我想要启动一个计时器时,我不想冻结UL,我应该在一个单独的线程中使用System.Threading.timer。第二个问题是:如果我想要使用Dispatcher,我想要一个不绑定到e UI,我应该使用System.Threading.Timer还是still DispatcherTimer在单独的线程中调用它?这取决于您尝试执行的操作。我很少使用System.Threading.Timer-我通常会坚持使用Dispatcher Timer,然后执行您的工作(这可能会阻止您的UI)在另一个线程中,使用BackgroundWorker之类的东西。计时器真的不应该阻止你的UI,除非你做得“太多”在他们的事件处理程序中工作。我发现Dispatchermer随着时间的推移会消耗处理器。有没有好的方法来处理这个问题?检查具体是什么消耗了cpu。您是否正在创建大量没有停止的计时器?确保正确设置interval属性。不要这样做:timer1.interval=new TimeSpan(1000);/“1000”表示滴答声而不是毫秒!CPU超高,直到我用以下内容更正它:timer1.Interval=System.TimeSpan.FromSeconds(1);Ops!真遗憾。此答案上的链接已断开。这也可能有助于-->