什么时候使用Thread.Sleep()是明智的?

我总是看到人们使用Thread.Sleep()来创建处理延迟或类似的东西,人们总是被这种方式使用它而受到嘲笑。

什么时候使用Thread.Sleep()是明智/需要的?

当你在后台线程中实际需要延迟时,你应该调用Thread.sleep()

不要调用它来帮助同步(它不会),不要在循环中调用它来等待某些东西(它会很慢)并且永远不要在UI线程上调用它(它会冻结)。

当你需要在一些一次性或测试代码中引入暂停时,Thread.Sleep()就可以了。

在生产代码中,最好尝试找到不同的选项。 例如,如果您尝试在某个时间间隔内执行某些操作,请使用许多预先存在的计时器类之一。 如果您在输入队列清空时(以及在.NET上)尝试暂停,请考虑使用Monitor.Wait()Monitor.Pulse()

更多(再次,以.NET为中心)解释本文中Sleep()的缺点: Thread.Sleep是一个设计不佳的程序的标志。

编写测试代码时。 如果你想看看一些函数如何处理由多个线程随机调用。

此外,如果您想模拟测试延迟。 假设您想测试进度条。

很少有我认为可以接受的情况。 最终,它归结为我脑海中的以下条件 – 其他人可能会对这些不适用的情况提出异议,但根据经验,以下所有内容都需要在生产中使用Thread.Sleep(又名琐事或测试代码:

  1. 你在等资源
  2. 有问题的资源没有提供适当的准备就绪通知(WaitHandle或其他东西)
  3. 您无法以其他方式修改相关资源
  4. 您已经测量并知道您需要等待足够长的时间以使SpinWait不合理,并且通过离开上下文可以获得更好的性能。

它可用于强制上下文切换(参数为1)或屈服于其他更高优先级的线程(参数为0)….但这很少需要。

如果你需要Thread.Sleep你可能有错误的设计。 更好地使用AutoResetEvent或ManualResetEvent等同步机制并等待事件发生。 我经常看到使用Thread.Sleep Polling,但如果可能的话,尝试使用事件会更好。

关于使用睡眠的投诉通常与有效(或相当无效)的multithreading设计有关。 multithreading是一个很大的主题,我只想简单地介绍一下它(Goetz的Java Concurrency in Practice)。

如果你想延迟你的处理代码一段固定的时间,那么sleep()是一件好事(但是, Timer类是实现周期性行为的好方法)。

只要您在操作中需要长时间停顿,就可以使用它。 如果规范说“现在等待至少10秒再继续”,则调用sleep(10000)。 还有一种方法 – 您可以将代码重写为状态引擎,以便可以放弃控制,直到向其发出计时器事件。 表驱动状态机非常灵活,允许完全异步操作。 由此产生的“代码”可能不会以任何方式与需求规范相似,它几乎不可能理解正在发生的事情,难以调试以及修改,维护和/或增强的噩梦,但是你将能够避免那种讨厌,反模式’睡眠(10000)’电话。

正如其他人发布的那样,不要将它用于线程间通信! 所有多任务操作系统都有大量更有效的sychro机制。

如果你想要一个线程停止做某事,当你做一个无限循环时,你不希望循环不停止,因为它也会占用大量的CPU能力,在它中添加一个thread.sleep将使循环“rest一下”并给cpurest一下^^。