Когда я нажимаю кнопку 1, значение табат сразу меняется с 8 до 1, тогда метод timer1_tick выполняется один раз правильно`.

int goSecondsLeft = 20;
    int restSecondsLeft = 10;
    int tabatas = 8;

    public Form1()
    {
        InitializeComponent();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {

        if (goSecondsLeft >= 0)
        {
            lbGoOrRest.Text = "Go!";
            lbSecondsRemaining.Text = goSecondsLeft.ToString() + " seconds";
            goSecondsLeft--;
        }
        else if (restSecondsLeft >= 0)
        {
            lbGoOrRest.Text = "Rest";
            lbSecondsRemaining.Text = restSecondsLeft.ToString() + " seconds";
            restSecondsLeft--;
        }
        else
        {
            timerGo.Stop();

        }   

    }    

    private void button1_Click(object sender, EventArgs e)
    {
        while (tabatas > 0)
        {
            lbTabatasRemaining.Text = "Tabatas remaining" + tabatas.ToString();
            timerGo.Start();
            tabatas--;
        }
    }

Я поставил точку останова в строке while (tabataas> 0) и продолжал входить, и каждый раз, когда цикл while выполнялся, значение tabata уменьшалось на единицу, как и ожидалось, но когда я запускаю программу, она сразу же переходит на 1, в то время как метод timer1_tick продолжает работать.

Мой рабочий код ниже:

           else
        {
            goSecondsLeft = 20;
            restSecondsLeft = 10;
            tabatas--;
            lbTabatasRemaining.Text = "Tabatas remaining" + tabatas.ToString();
            timerGo.Stop(); 
        }   

    }    

    private void button1_Click(object sender, EventArgs e)
    { 
            timerGo.Start();
    }
c#
2
Jerry Murphy 26 Фев 2016 в 23:00
Возможно, проблема связана с потоком.
 – 
Evan Carslake
26 Фев 2016 в 23:02
Почему вы перезапускаете таймер в цикле? также, каков интервал таймера?
 – 
Gusman
26 Фев 2016 в 23:05
Интервал составляет 1000 мс, я хочу, чтобы код в методе time1Tick выполнялся 8 раз.
 – 
Jerry Murphy
26 Фев 2016 в 23:06

1 ответ

Лучший ответ

В вашем цикле while нет ничего, что могло бы вызвать задержку, поэтому он выполняется почти мгновенно. Возможно, вы какое-то время думали, что Timer.Start блокируется, но это не так. Он просто запускает таймер в фоновом режиме и мгновенно возвращается.

Не уверен, что именно вы пытаетесь сделать, но если вы хотите, чтобы переменная tabatas уменьшалась во времени, удалите цикл и вместо этого уменьшите значение переменной в обработчике событий таймера.

3
Matti Virkkunen 26 Фев 2016 в 23:06
Я попытался уменьшить значение переменной tabata в обработчике тиков, но я не знаю, как это сделать, только один раз, когда кажется, что это происходит каждый тик.
 – 
Jerry Murphy
26 Фев 2016 в 23:10
Я предполагаю, что это какой-то интервальный таймер. У вас должно быть место в вашем коде, где вы сбрасываете свои счетчики движения / отдыха на максимум, когда ваша фаза "отдыха" заканчивается - может быть, уменьшите его там?
 – 
Matti Virkkunen
26 Фев 2016 в 23:11
Да, я изменил код в инструкции else, чтобы сбросить переменные и уменьшить переменную tabata, и она отлично работает, ура.
 – 
Jerry Murphy
26 Фев 2016 в 23:18