gpt4 book ai didi

.net - Thread.Sleep()与Monitor.Wait/Monitor.Pulse

转载 作者:行者123 更新时间:2023-12-03 13:20:54 26 4
gpt4 key购买 nike

我有一个Windows服务,可以托管一个或多个后台线程。每个后台线程都会启动一个轮询循环以检查工作。我一直在使用以下模式来实现循环:

new Thread(DoWork).Start();

private void DoWork()
{
while(keepRunning)
{
Console.WriteLine(DateTime.Now);
Thread.Sleep(1000);
}
}

我试图找到一种替代方法,它将消耗更少的CPU。我已经能够使用带有递归方法的Timer实现轮询循环:
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();
}
}

使用一种模式相对于另一种模式有什么优势吗?是否有更好的模式在后台线程中设置轮询循环?

最佳答案

I'm trying to find an alternative that will consume less CPU.



您是否有任何证据表明它目前确实在消耗大量CPU?除非您有很多线程在相似的时间醒来并竞争,否则我希望 Thread.Sleep相当有效。

您的递归 DoWork方法要糟糕得多-除非对尾调用进行了优化,否则最终将导致堆栈溢出。您为什么至少不循环播放?您为什么不只是在计时器线程中进行实际工作呢?

如果您确实想要每个任务一个线程,每秒执行一次工作,那么您的第一个代码就可以了(尽管您只是想确保自己“看到”了 keepRunning的任何新值,如果它只是一个字段,请考虑使用 Interlocked) 。不过,理想情况下,您根本不应该拥有这些线程-仅具有适当的计时器来每秒安排一次工作,并让线程池进行处理。

关于.net - Thread.Sleep()与Monitor.Wait/Monitor.Pulse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13020764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com