是Thread.Sleep(Timeout.Infinite); 效率高于while(true){}?
我有一个控制台应用程序,我希望在仍然收听事件的同时保持打开状态。 我测试了Thread.Sleep(Timeout.Infinite);
和while (true) { }
都允许在保持控制台应用程序打开的同时引发事件。 我应该使用另一个吗? 如果线程正在hibernate,是否有任何我不应该做的事情,比如修改在类范围内声明的静态集合?
我建议使用ManualResetEvent
(或其他WaitHandle
),并调用ManualResetEvent.WaitOne 。
这将有一个类似于永远睡眠的效果,除了它为你提供一个干净的方式,在需要时退出你的无限“块”(通过调用事件上的Set()
)。
使用while(true)
将消耗CPU周期,因此它肯定是要避免的。
有什么我不应该做的,比如修改在类范围内声明的静态集合?
一般来说,没有。 由于您的线程将被阻止,因此使用共享数据时不应存在任何同步问题(前提是集合中的项目没有特定要求,例如必须在具有适当同步上下文的线程上使用的用户界面元素。)
与while(true)...
, Thread.Sleep
不使用CPU周期,因此从这个意义上说,睡眠效率更高。 一般来说,强烈建议不要在自旋锁之外使用忙碌等待 。
如果线程正在睡眠,那么我有什么不该做的吗?
由于您的线程在进入Thread.Sleep
时被阻止,因此您希望对其资源执行的任何操作都是公平的。
我想是电话
while (true) { ... }
是计算密集型的,因为线程永远不会停止,wheareas
Thread.Sleep(Timeout.Infinite);
实际上,在OS本机调度程序的帮助下让线程进入hibernate状态。 然后线程实际上停止了,所以我认为它的计算要求不高。
是的 , while(true)
消耗CPU,而sleep()
以更智能的方式工作: sleep()
函数将当前执行上下文置于hibernate状态; 它通过调用一个系统调用以primefaces方式调用内核hibernate函数来完成此操作
(a)设定一个叫醒计时器
(b)将目前的过程标记为睡眠
(c)等待直到唤醒定时器触发或发生中断
如果你调用sleep()
,CPU可以做其他工作。
这就是sleep()
有用的原因之一。
一个有用的链接 – 使用Sleep时要小心
调用Thread.Sleep方法会导致当前线程立即阻塞毫秒数或传递给方法的时间间隔,并将其时间片的剩余部分转换为另一个线程。
https://msdn.microsoft.com/en-us/library/tttdef8x(v=vs.110).aspx