То, что должно быть прямым, не здесь, и я пока не могу найти выход, несмотря на то, что много читаю.
У меня есть кнопка, которая выполняет функцию времени. Поэтому при нажатии на кнопку должно отображаться время в миллисекундах в метке с интервалом 500 мс. И когда желаемый результат будет достигнут, я хочу, чтобы таймер остановился. Мне не нужно просто указывать конечное время (общее время, потраченное) в метке, но метка должна динамически отображать истекшее время. Мой код будет:
private void btnHistory_Click(object sender, EventArgs e)
{
Class1 c = new Class1();
c.StartClock(ref label12);
Utility.PopulateHistory(dgvRecords_history, _util); //time consuming function
c.StopClock();
}
А в Class1
пишу так:
internal void StartClock(ref Label l)
{
Timer t = new Timer();
t.Interval = 500;
t.Enabled = true;
t.Tag = l;
t.Tick += new EventHandler(t_Tick);
t.Start();
}
int i;
bool stop;
void t_Tick(object sender, EventArgs e)
{
if (stop)
{
((Timer)sender).Stop();
return;
}
((Label)((Timer)sender).Tag).Text = (++i).ToString();
}
internal void StopClock()
{
i = 0;
stop = true;
}
Что происходит, событие t_Tick
запускается только после того, как сработает полный код под событием кнопки. То есть событие галочки запускается после того, как оно проходит через функцию StopClock! Я понятия не имею, с какой стати это должно быть так!
2 вопроса в основном:
Как правильно выполнить мое требование, чтобы справиться с этим? Я знаю, что я должен использовать другие встроенные классы для оценки производительности, но это только для целей отображения. Для этого какой идеальный подход?
Почему мой код не работает?
РЕДАКТИРОВАТЬ: Я использовал здесь System.Windows.Forms Timer
здесь, но результат ничем не отличается с System.Timers Timer