Reza29ir Ответов: 3

Таймер замораживания при использовании "While" в c#


Привет

Я хочу иметь таймер, который запускается после нажатия кнопки.
через заданное время он должен немного установиться.
В процедуре кнопки я жду этого бита, но он застывает в "пока"!!!!
private void btnStart_Click(object sender, EventArgs e)
   {
       timer1.Interval = 100;
       TimerEnd = false;
       label1.Text = "Process Started...";
       timer1.Enabled = true;
       while (!TimerEnd) ;
       label1.Text = "Process Finished";

   }

   private void timer1_Tick(object sender, EventArgs e)
   {
       counter++;
       if (counter > 10)
       {
           TimerEnd = true;
           counter = 0;
       }

   }

Sergey Alexandrovich Kryukov

Точный тип таймера, пожалуйста. Это очень важно. Не так ли System.Windows.Forms.Timer? System.Timers.Timer?
--СА

3 Ответов

Рейтинг:
1

hgh6484

Привет, Просто заменять

while (!TimerEnd) ;

с
while (!TimerEnd)
{
    Application.DoEvents();
}


Dave Kreskowiak

нет, нет, нет. Приложение.DoEvents () - это плохое решение для чего угодно. Если вы используете его, вы делаете резьбу или что-то еще, очень неправильно. DoEvents создает проблемы в вашем коде, если вы понятия не имеете, что он делает за кулисами. Одним из примеров являются обработчики событий, которые не следует запускать снова, если они уже запущены.

Вопрос ОП, заданный 7 лет назад, был вызван плохим пониманием того, как работает потоковая передача, и сегодня шаблон, который он продемонстрировал, будет лучше справляться с задачами.

Рейтинг:
0

Clifford Nelson

    private void btnStart_Click(object sender, EventArgs e)
        {
            timer1.Interval = 100;
Add ->      timer1.Tick += timer1_Tick
            TimerEnd = false;
            label1.Text = "Process Started...";
            timer1.Enabled = true;
            while (!TimerEnd) ; 
            label1.Text = "Process Finished";
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            counter++;
            if (counter > 10)
            {
                TimerEnd = true;
                counter = 0;
            }      
        }

Вы никогда не устанавливаете обработчик событий.


Sergey Alexandrovich Kryukov

Это возможно, но вы не можете утверждать это наверняка; может быть, ОП этого не показывал.
--СА

Reza29ir

Уважаемый Сергей
Как вы знаете, в Form1.Designer.cs у нас есть
это.timer1.ТИК += новая система.EventHandler(this.timer1_Tick);
Итак, я сделал это!!

Рейтинг:
0

Ashutosh Gpta

как насчет этого. это то, что вы ищете, я думаю.
Система.Таймеры.Время таймера = новая система.Таймеры.Таймер(100);
время.Истекшее Время += Time_Elapsed;


частных статических недействительным Time_Elapsed(объект отправителя, система.Таймеры.ElapsedEventArgs е)
{
этикетка 1.Text = "Процесс Завершен";
}


Dave Kreskowiak

Попробуйте прочитать другие ответы вместе с вопросом и посмотреть на дату вопроса, прежде чем отвечать. Этому уже 7 лет. Я серьезно сомневаюсь, что ОП все еще ищет ответ.

Ashutosh Gpta

почему вы так думаете, что это только для ОП, а не для других в будущем, пока и если они не получат правильный ответ. во всяком случае, я не знал даты, но этот вопрос появлялся в верхней части списка, чтобы ответить. Даун-голосование за ответ, не замечая даты заданного вопроса, в любом случае я не возражаю против Даун-голосования, это наверняка поможет кому-то в будущем.

Dave Kreskowiak

Потому что ваш ответ был не более чем урезанной версией решения 2 без объяснения того, что ОП пропустил.