【发布时间】:2016-06-06 16:47:48
【问题描述】:
在单线程控制台应用程序中,人们经常使用Thread.Sleep 作为一种懒惰的方式来暂停应用程序一段时间。
这个问题提出了关于不使用这种方法的有趣观点:Why is Thread.Sleep so harmful
但是,除了知道 Sleep 会阻塞当前线程之外,我不明白它是如何工作的 - 例如,它是在一个紧密的循环中最大化 CPU 内核还是实际上暂停了线程?
对我来说更重要的是,控制台应用程序在睡眠过程中如何响应各种应用程序退出场景(CTRL-C、kill、窗口关闭按钮)?它会盲目地继续执行直到操作系统强制杀死它,还是会表现良好?
【问题讨论】:
-
它只是告诉操作系统的线程调度程序不要重新调度线程以在指定的时间内执行。可以肯定的是,它已“暂停”。控制台终止由操作系统实现,并简单地终止进程。无论进程中的线程在做什么都是无关紧要的,它们不再是挪威鹦鹉式的。
-
感谢@HansPassant 'suspended' 是我想要的术语——因为 Sheeo 明确指出线程被挂起而不是导致自旋锁。不错的 MP 参考。
-
嗯,不,这不是您想要的术语。挂起的线程与 Sleep() 没有任何关系。但是话又说回来,任何使用 SuspendThread() 的人都应该受到他们将得到的所有痛苦。
-
现在我很困惑@HansPassant,因为
Sleep的文档说“Sleep 函数 - 暂停当前线程的执行,直到超时间隔已过”(msdn.microsoft.com/en-us/library/windows/desktop/…)您介意在答案中澄清这一点吗?
标签: c# .net multithreading thread-sleep