【问题标题】:How do timers work in .NET?计时器如何在 .NET 中工作?
【发布时间】:2012-12-27 15:21:07
【问题描述】:

我正在用 C# 编写一个控制台应用程序,我的代码是这样的:

 while(true)
 {
 //do some stuff
     System.Threading.Thread.Sleep(60000)
 }

我注意到我的应用程序在“睡眠”时的内存使用量约为 14k。 但后来我引用了 System.Windows.Forms 并改用了计时器,我注意到内存使用量大幅下降。

我的问题是,在不使用那么多内存的情况下,每隔几秒执行一次的正确方法是什么?

【问题讨论】:

  • 请不要将Thread.Sleep() 用于计时目的。它不准确。
  • Here 是关于 Thread.Sleep 的有趣文章,补充一下 vanneto 所说的,与计时器相比,将 Thread.Sleep 与 while(true) 循环结合使用也会导致 CPU 使用率较高
  • FWIW Thread.Sleep 与 BCL 中的任何计时器相比实际上都非常准确。我的测试表明Sleep 精确到 ~1ms,标准差为 0.08ms。另一方面,System.Threading.Timer 仅精确到 ~14ms,stddev 为 0.6ms。里程会有所不同。
  • 另外,Sleep 不会导致 CPU 过高。事实上,在我的机器上,超时为 1 或更高,在紧密循环中调用 Sleep 将产生约 0% 的 CPU 使用率。 Sleep(0) 当然会消耗约 100% 的 CPU 使用率。这是有原因的,因为Sleep(0)Sleep(1) 具有特殊含义。

标签: c# .net multithreading timer


【解决方案1】:

你应该使用System.Timers.Timer

添加一个方法来处理Elapsed 事件并执行你想要的代码。在你的情况下:

System.Timers.Timer _timer = new System.Timers.Timer();

_timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
_timer.Interval = 60000;
_timer.Enabled = true;

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
   // add your code here
}

这里有一篇关于Timers 两者区别的好帖子:

【讨论】:

    【解决方案2】:

    你需要使用Timer类。

    有多个内置定时器(System.Timers.TimerSystem.Threading.TimerSystem.Windows.Forms.TimerSystem.Windows.Threading.DispatcherTimer),这取决于使用哪个定时器的要求。

    阅读this 的答案,了解应该在哪里使用哪个计时器。

    以下内容很有趣。
    Comparing the Timer Classes in the .NET Framework Class Library

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多