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

edi*_*ode 20 c# java multithreading

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

什么时候合理/需要使用Thread.Sleep()

SLa*_*aks 26

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

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

  • 只是添加:并且不要尝试使用Thread.Sleep构建精确的计时器. (11认同)
  • +1没有加强,现在有点烦人,'睡觉永远是坏'的口头禅.我确信许多开发人员已经采用了这种方法,现在正在尝试调试复杂的,异步的,定时器和其他事件驱动的状态机而不是简单的程序代码,使用sleep()进行等待,它们是将在一个线程中运行. (3认同)
  • @Matthew - 听起来像'滥用'类别,我害怕:(接受/读/写等常见的套接字操作不需要轮询. (2认同)

Sea*_*n U 5

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

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

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

  • +1它有很多非生产代码用途。在开发/演示多线程框架等时演示长时间运行的任务也很有用。知道它只是实际工作的代表。 (2认同)

Chr*_*ain 5

在极少数情况下,我认为它可以接受。最终,这归结为以下情况:在某些情况下,其他情况可能会引起其他人的注意,但根据经验,我必须在生产中使用Thread.Sleep满足以下所有条件(又名不琐碎或测试)的代码:

  1. 您正在等待资源
  2. 有问题的资源没有提供适当的主动就绪通知(WaitHandle之类的东西)
  3. 您不能通过其他方式修改相关资源
  4. 您已经进行了测量,并且知道您需要等待足够长的时间才能证明SpinWait不成立,并且可以通过离开上下文来获得更好的性能。