System.Threading.SpinWait 是一个轻量同步类型,可以在低级别方案中使用它来避免内核事件所需的高开销的上下文切换和内核转换。 在多核计算机上,当预计资源不会保留很长一段时间时,如果让等待线程以用户模式旋转数十或数百个周期,然后重新尝试获取资源,则效率会更高。 如果在旋转后资源变为可用的,则可以节省数千个周期。 如果资源仍然不可用,则只花费了少量周期,并且仍然可以进行基于内核的等待。 这一旋转-等待的组合有时称为“两阶段等待操作”。
简单的说SpinWait 更省资源
while(true) { Thread.Sleep(1); }
CPU 大约用掉了 2%
如果 Thread.Sleep(1) 去掉,则CPU接近耗掉50%
然后把Thread.Sleep拿掉,改用 SpinWait.SpinUntil
SpinWait.SpinUntil(() => false, 1000);//当第一个参数为true时结束等待,第二个是超时设置
CPU使用0%