Таймер стреляет до истекшего интервала - PullRequest
0 голосов
/ 11 марта 2012

Я пытаюсь создать приложение Windows Form, которое ищет строку и имеет три возможных сценария:

  1. Строка 1 найдена - подождите
  2. Строка 2 найдена - остановка
  3. Остальное - выполнить действие и подождать 1 минуту

Я сталкиваюсь с моей проблемой только в те моменты, когда ожидается ее ожидание. Когда это происходит, 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 ]

5 голосов
/ 11 марта 2012

Каждый раз, когда вызывается следующая строка, новый экземпляр обработчика события newTimerTick добавляется в список вызовов для события Tick:

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

Так что каждый раз, когда тик срабатывает newTimerTick будет вызываться несколько раз, что даст вам неожиданные результаты.

Настройте обработчик событий только один раз. В конструкторе будет разумное место.

0 голосов
/ 11 марта 2012

Я думаю, что вам не хватало того, что вы должны остановить свой таймер, так как на самом деле вы не хотите, чтобы он работал более одного интервала. Кажется, вы хотите запустить его один раз, проверить результат, а затем решить, хотите ли вы продолжать его или нет. Вот код:

  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);
    }
0 голосов
/ 11 марта 2012

Вы пытались остановить таймер методом Timer.Stop?

Кстати: я не думаю, что вам нужно переназначать событие Tick из newTimer, если вы не создаете новый Timer каждый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...