gpt4 book ai didi

c# - 使用 Thread.Sleep() 实现心跳

转载 作者:行者123 更新时间:2023-11-30 13:49:30 24 4
gpt4 key购买 nike

在我的应用程序中,我有一个“心跳”功能,目前在一个长时间运行的线程中以下列方式(伪代码)实现:

while (shouldBeRunning)
{
Thread.Sleep(smallInterval);

if (DateTime.UtcNow - lastHeartbeat > heartbeatInterval)
{
sendHeartbeat();
lastHeartbeat = DateTime.UtcNow;
}
}

现在,当我的应用程序正在经历一些密集的 CPU 时间(几分钟的繁重计算,其中 CPU 被占用 > 90%)时,心跳会延迟,即使 smallInterval << heartbeatInterval。

计算一些数字:heartbeatInterval 是 60 秒,lastHeartbeat 是 0.1 秒,报告的延迟最多可达 15 秒。因此,根据我的理解,这意味着当 CPU 非常繁忙时,Sleep(10) 可以像 Sleep(15000) 一样持续。

我已经尝试将线程优先级设置为 AboveNormal - 我该如何改进我的设计以避免此类问题?

最佳答案

有什么理由不能为此使用计时器吗?您可以使用三种类型,我通常选择 System.Timers.Timer .不过,以下文章讨论了这些差异:

http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

本质上,计时器将允许您设置一个具有周期性间隔的计时器,并在该时间段过去时触发一个事件。然后,您可以使用调用 sendHeartbeat() 的委托(delegate)来订阅该事件。

计时器应该能更好地为您服务,因为它们不会像休眠线程那样受到 CPU 负载的影响。它的优点是代码更简洁(计时器设置非常简单且可读),并且您不会有多余的线程。

关于c# - 使用 Thread.Sleep() 实现心跳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9399860/

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