是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