定时器在经过时间间隔之前触发

时间:2012-03-11 12:47:19

标签: c# .net winforms timer

我正在尝试创建一个搜索字符串的Windows窗体应用程序,它有三种可能的场景:

  1. 找到字符串1 - 等待
  2. 找到字符串2 - 停止
  3. 其他 - 执行操作并等待1分钟
  4. 我只是在期待等待的时候遇到我的问题。发生这种情况时,newTimer_Tick开始每秒都打勾。我已经尝试在计时器和其他一些东西时禁用计时器,但似乎都没有。以下是代码:

    public void Action(string result)
    {
        if (result.Contains("string1"))
        {
            // Check again in 10 + x seconds
            int n = new Random().Next(0, 5000);
            int newtime = 10000 + n;
            newTimer.Tick += new EventHandler(newTimer_Tick);
            newTimer.Interval = newtime;
            newTimer.Enabled = true;
        }
        else if (result.Contains("string2"))
        {
            // Turn off
            newTimer.Enabled = false;
        }
        else
        {
            // Perform action and tick again in 1min + x seconds
            action1();
    
            int n = new Random().Next(0, 5000);
            int newtime = 600000 + n;
            newTimer.Tick += new EventHandler(newTimer_Tick);
            newTimer.Interval = newtime;
            newTimer.Enabled = true;
        }
    }
    
    private void newTimer_Tick(object sender, EventArgs e)
    {
        Action( result );
    }
    

    我做错了什么?

3 个答案:

答案 0 :(得分:5)

每次调用以下行时,事件处理程序 newTimerTick 的新实例都会添加到Tick事件的调用列表中:

newTimer.Tick += new System.EventHandler(newTimer_Tick);

因此,每当时间标记响起时, newTimerTick 将被多次调用,这将给您带来意想不到的结果。

仅配置一次事件处理程序。在构造函数中将是一个明智的地方。

答案 1 :(得分:0)

您是否尝试使用Timer.Stop方法停止计时器?

Btw:除非您不是每次都创建新的Tick,否则我认为您不需要从newTimer重新分配Timer事件。

答案 2 :(得分:0)

我认为你缺少的是你必须停止你的计时器,因为你实际上并不希望它保持一个以上的间隔。您似乎想要运行一次,检查结果,然后决定是否要继续运行它。这是代码:

  public void action(string result)
    {
        int n = new Random().Next(0, 5000);
        Boolean blActivateTimer = true;
        Timer timer = new Timer();
        timer.Tick += timer_Tick;
        if (!result.Contains("string1") && !result.Contains("string2"))
        {
            n += 600000;
            action1();
        }
        else
        {
            if (result.Contains("string1"))
            {
                n += 10000;
            }
            else
            {
                blActivateTimer = false;
            }
        }
        if (blActivateTimer)
        {
            timer.Start();
        }
    }
    void action1()
    {

    }
    void timer_Tick(object sender, EventArgs e)
    {
        Timer t = (Timer)sender;
        t.Stop();
        action(result);
    }