C# 计时器 - 需要帮助禁用计时器,直到代码执行,然后重新启动计时器.当前最大 CPU :(
本文关键字:计时器 然后 重新启动 CPU 执行 帮助 代码 | 更新日期: 2023-09-27 18:37:04
基本上,我正在尝试组合的这个计时器程序有问题。启动程序时,它将使用稳定的 25% CPU,我不介意,但每次计时器触发时,它都会在 CPU 上增加另外 25%,因此在第 4 遍时我完全用尽了。
我认为我在计时器触发后没有正确处理计时器,但我是 c# 的新手,不确定如何做到这一点。
我的程序的应对方式基本上是:
- 执行一些过程 - 完成后启动计时器
- 等到计时器过去,然后再次启动过程,禁用计时器直到完成
任何帮助将不胜感激:)
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
IpCheck();
}
private static void EnableTimer()
{
System.Timers.Timer aTimer = new System.Timers.Timer();
// Set the Interval to x seconds.
aTimer.Interval = 10000;
aTimer.Enabled=true;
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Enabled = false;
aTimer.Dispose();
}
好的,下面的修订版 - 简化并排除了 IP 检查,所以它现在所做的只是显示一个消息框 - 这甚至不会再执行:(
public class Timer1
{
System.Timers.Timer aTimer = new System.Timers.Timer();
public static void Main()
{
Timer1 tTimer = new Timer1();
tTimer.EnableTimer();
}
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
aTimer.Enabled = false;
MessageBoxPrint();
aTimer.Enabled = true;
}
private void EnableTimer()
{
// Set the Interval to x seconds.
aTimer.Interval = 10000;
aTimer.Enabled=true;
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
}
public static void MessageBoxPrint()
{
MessageBox.Show("Testing");
}
}
您可能正在寻找类似这样的东西:
private static System.Timers.Timer aTimer = new System.Timers.Timer();
// This method will be called at the interval specified in EnableTimer
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
aTimer.Enabled = false; // stop timer
IpCheck();
aTimer.Enabled = true; // restart timer so this method will be called in X secs
}
private static void EnableTimer()
{
// Set the Interval to x seconds.
aTimer.Interval = 10000;
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Enabled=true; // actually starts timer
}
我不放弃得到,为什么你有 cpu 负载,但我会这样做:
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
((Timer)source).Enabled = false;
IpCheck();
((Timer)source).Enabled = true;
}
并且不要在方法调用中释放计时器。
问题是他在 Timer1 类中创建了一个 Timer1,所以当你加载 Timer1 时,它会加载另一个 Timer1,该 Timer1 加载另一个加载的 timer1。 它认为你明白了
public class Timer1
{
System.Timers.Timer aTimer = new System.Timers.Timer();
public static void Main()
{
Timer1 tTimer = new Timer1();//<-this line right here is killing you
//remove it, as I don't see anyuse for it at all
那么在这一行中
tTimer.EnableTimer();
只是说
EnableTimer();
//or
this.EnableTimer();
您不需要实例化您正在使用的类,就其而言,它已经实例化了。
static System.Timers.Timer aTimer = new System.Timers.Timer();
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
aTimer.Enabled=false;
IpCheck();
aTimer.Enabled=true;
}
private static void EnableTimer()
{
// Set the Interval to x seconds.
aTimer.Interval = 10000;
aTimer.Enabled=true;
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
}
private static void DisableTimer()
{
aTimer.Elapsed -= new ElapsedEventHandler(OnTimedEvent);
aTimer.Enabled = false;
}
未测试未编译,只是一个示例,我会在您的位置上做什么,所有添加的行都在那里,没有选项卡