我已经创建了一个看门狗计时器(使用 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/