【问题标题】:Does repeating Thread.Sleep(200) and Thread.Sleep(1) do the same thing?重复 Thread.Sleep(200) 和 Thread.Sleep(1) 做同样的事情吗?
【发布时间】:2014-02-06 12:55:29
【问题描述】:

我正在编写一个 .Net Micro Framework 应用程序,它启动一个计时器,然后在每次计时器滴答声发生时执行一些操作。代码如下:

public void Run()
{
    var timer = new Timer(DoStuff, null, 120000, 120000);
    while (true)
    {
        Thread.Sleep(1);
    }
}

所以每两分钟就会调用一次方法 DoStuff。我需要 while 循环来防止应用程序退出。传递给 Thread.Sleep 的毫秒数的选择意味着什么?小值(如 1)是否会使应用程序对计时器的反应更快?较大的值是否消耗较少的 CPU 功率?

========== 编辑 ==========

我刚刚在GHI page about .Net Micro Framework Timers 的这个精简示例中找到了我应该(可能)使用的调用而不是 while 循环:

Thread.Sleep(Timeout.Infinite);

我可以将 'infinte' 添加到我要理解的值列表中。

【问题讨论】:

  • 你不应该在这里使用Sleep。你为什么决定这样做?
  • 这似乎是保持应用程序活动并等待计时器滴答声的明显方法。你会放什么来代替大卫?
  • 你用的是什么定时器?就个人而言,我想我可能会摆脱计时器,并在 while (true) 循环中调用 Thread.Sleep(120000)
  • David,这是我的第一次尝试,但我换成了计时器,部分原因是它看起来更好(但我可能会倒退!),部分原因是为了在调试输出问题上尝试不同的方法 @987654322 @(顺便说一句,我喜欢我在 Chrome 中的字典想要将 stackoverflow.com 纠正为有争议的人)
  • 如果您希望线程在等待下一个滴答声时执行其他工作,您通常会使用计时器。但是,如果您的线程可以空闲到下一个滴答声,那么纯 while (true)Sleep 效果很好。

标签: .net multithreading .net-micro-framework


【解决方案1】:

您在这里尝试做什么并不明显。为什么不根据需要频繁地触发计时器并通过计时器方法执行定期工作?

至于睡眠,默认情况下它具有一定的粒度,遵循 Windows 计时器滴答,因此默认情况下您不会获得 1 毫秒的分辨率。是的,调用 Sleep 1000 次而不是一次显然会消耗更多的 CPU 功率,但在大多数情况下差异可能并不显着。

【讨论】:

  • 我不确定这是否明显。 Thread.Sleep(n) 到底在做什么?
  • @dumbledad 好吧,它在 CPU 上执行代码。这不是很多代码。但它是代码。除了运行这些指令所需的工作、线程调度程序的压力等之外,这还需要上下文切换——操作系统必须获得一个空闲的 CPU 内核,停止它,将所有寄存器保存到内存中,然后它必须加载你从内存中注册并启动你的线程。然后你运行代码花絮来做while和睡眠,然后把自己交给另一个线程,需要另一个上下文切换。你甚至不能保证它会运行 X 次,因为 Sleep 可以在 1ms 或 15 或 ... 内返回
  • 感谢 Luaan,这将是一个很好的答案。 @ 500-internal-server-error,我不明白您的意思是“为什么不根据需要经常触发计时器并通过计时器方法定期工作?”这不正是我的代码所做的吗?
  • 也许你确实在定时器回调上做你的工作,这很好,但如果你在你的主线程中没有任何额外的逻辑处理,那么而不是像你在这里那样使用 Sleep 循环相反,应该在事件或类似事件上阻止该线程,并且仅在您想终止时从计时器回调中发出该事件的信号。与您在此处执行的操作相比,这将消耗很少的 CPU 功率。
猜你喜欢
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2010-11-27
  • 2013-10-04
  • 1970-01-01
  • 2021-12-22
相关资源
最近更新 更多