除了模拟持久性任务之外,Thread.Sleep()还有其他用途吗?

时间:2014-03-19 15:11:24

标签: multithreading language-agnostic

我发现Thread.Sleep()在模拟持久性任务并以优雅的方式取消它们时非常有用(避免使用Thread.Abort()),另一方面,我已经阅读过使用Thread .Sleep()等待其他操作结束是一种不好的做法(我们有Thread.Join()来做)。我想知道在实际的生产代码/情况中是否有Thread.Sleep()的应用程序。

3 个答案:

答案 0 :(得分:2)

以下是一些:

  1. Sleep(0)引发一个上下文切换,产生另一个具有相同或更高优先级的等待线程。
  2. 有时,您不想使用计时器。定时器滴答可以同时发生,定时器不能可靠地停止。由于竞争条件而导致计时器停止后,您可以收到无限多个刻度(即刻度可能会排队并稍后传送)。如果您希望每分钟执行一次操作,则睡眠循环是一种有效的解决方案。
  3. 限制运营。也许你只想问你的推特,就像你有配额一样。

答案 1 :(得分:1)

不确定。如果规范说等待5秒,某个地方的某个地方,Sleep(5000)对我有效,例如:

'启动压缩机后,等待五秒钟以使压力稳定,然后再打开燃油阀。

经常被嘲笑的Sleep()调用确实有一些优点。它不涉及运行计时器的其他线程。它适用于所有线程上任何深度的任何调用堆栈。它不需要将现有代码重写为状态机。

OTOH:它常常被误用于轮询线程间标志,而不是使用更合适且更少浪费的线程间信令。睡眠(0)和睡眠(1)循环通常只是浪费时间,CPU和内存带宽。

答案 2 :(得分:0)

这取决于您是否想要或不想阻止该线程。 Thread.Sleep()将阻止该帖子。

例如,如果您有一个在某处发送请求的线程,但突然连接断开,那么您可以使用Thread.Sleep()等待一段时间再尝试(这可能是一个瞬态连接错误)

正如我所说,它会阻塞线程,因此线程被冻结,没有其他人可以使用它。 或者,您可以使用await Task.Delay()并释放该线程,直到给定的超时到期为止。