0

基本上我对我试图放在一起的这个计时器程序有一个问题。在启动程序时,它将使用稳定的 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");
    }
}
4

4 回答 4

2

您可能正在寻找这样的东西:

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
}
于 2012-06-14T10:14:13.633 回答
0

我不放弃,为什么你有 cpu 负载,但我会这样做:

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    ((Timer)source).Enabled = false;
    IpCheck();
    ((Timer)source).Enabled = true;
}

并且不要在方法调用中处理计时器。

于 2012-06-14T10:14:46.690 回答
0
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;


}

未测试未编译,只是我会在你的地方做的一个示例,所有添加的行都在那里,没有标签

于 2012-06-14T10:18:27.247 回答
0

问题是他在 Timer1 类中创建了一个 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();

您不需要实例化您正在使用的类,就它而言,它已经实例化了。

于 2012-06-14T11:23:16.063 回答