我有一个可以托管一个或多个后台线程的 Windows 服务。每个后台线程启动一个轮询循环来检查工作。我一直在使用以下模式来实现循环:
new Thread(DoWork).Start();
private void DoWork()
{
while(keepRunning)
{
Console.WriteLine(DateTime.Now);
Thread.Sleep(1000);
}
}
我正在尝试找到一种消耗更少 CPU 的替代方案。我已经能够使用带有递归方法的计时器来实现轮询循环:
var timer = new Timer(WakeUp, null, Timeout.Infinite, 1000)
timer.Change(0, 1000);
private void WakeUp(object state)
{
lock (locker)
Monitor.Pulse(locker);
}
private void DoWork()
{
lock (locker)
{
if (!keepRunning) return;
Console.WriteLine(DateTime.Now);
Monitor.Wait(locker);
DoWork();
}
}
使用一种模式比另一种模式有什么优势吗?在后台线程中设置轮询循环是否有更好的模式?