c# - C# 计时器的密集停止/启动

标签 c# performance timer

我已经创建了一个看门狗计时器(使用 System.Windows.Forms.Timer),如果很长一段时间到期而没有收到小数据包,它就会触发:

using System.Windows.Forms;
public class Watchdog
{
    private Timer Timer;

    public void Go()
    {
        Timer.Start();
    }

    public void Reset()
    {
        Timer.Stop();
        Timer.Start();
    }

    private void OnTimerExpired(object State)
    {
        Timer.Stop();
        DoSomething();
    }

    public Watchdog()
    {
        Timer = new Timer();
        Timer.Tick += new EventHandler(OnTimerExpired);
        Timer.Interval = (1000 * Timeout);            
    }
}

主代码调用Go(),然后在每次接收到数据包时调用Reset()。如果计时器到期,将调用 OnTimerExpired()

由于每秒可能有数百个数据包接收,并且由于应用程序的主要工作是响应此类数据包,我开始怀疑重置计时器是否不会占用太多 CPU/OS。

知道以这种方式调用 Timer.Stop()/Timer.Start() 会如何影响性能(在延迟方面)吗?

最佳答案

使用一个简单的时间跨度或整数变量作为标志。当计时器滴答作响时,它会检查 Stopwatch 对象以查看自上次更新标志以来已经过去了多少时间。如果它比您的超时值长,您会触发看门狗代码。

现在,当有新数据包进入时,其他代码可以只使用秒表更新您的时间跨度标志值,而不是重置您的计时器。

您还应该将计时器的滴答间隔设置为您希望实际超时持续时间的大约 1/2,或者在事件中使用代码来设置您的间隔,这样您的下一个滴答事件就在您之后几毫秒如果现在断开连接,将会超时。否则,在滴答事件后最后一个数据包很快到达的情况下,您最终等待的时间几乎是超时持续时间的两倍。

关于c# - C# 计时器的密集停止/启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9216802/

相关文章:

使用 layer.shadow 时的 Objective-C 性能优化

c# - C#Winforms System.Threading.Timer

java - 从单独的方法关闭计时器

java - Android CountDownTimer - 添加时间导致多个计时器运行

c# - 安装项目,自定义安装程序,连接字符串

c# - 如何通过基类中的方法返回通用类型?

c# - DataValidation 模型/ViewModel/ Entity Framework 代码优先

c# - 用于作业的 Kubernetes 服务帐户

javascript - 哪个效率更高?重复选择器或更简洁选择器的变量

performance - 使用云/分布式计算共享处理器时间 - 可能性和方法