我正在尝试使用Timer(使用https://www.geoffstratton.com/cnet-countdown-timer代码)实现简单的倒计时。如果我运行一次计时器,它确实可以工作,但是如果我停止计时器,或者下一次我将其启动到00:00时,它将快2倍。如果我停止并重新启动它,它的运行速度将提高3倍。
(我的解释可能不清楚,我做了gif演示了问题) https://media.giphy.com/media/fQr7sX6LNRECvQpCYP/giphy.gif
我是C#的新手,我通常会弄清楚事情,但我无法了解这里发生的事情。 我包括了计时器代码。如果有人可以帮助我,那就太好了! 谢谢!!!
private void btnStartTimer_Click(object sender, EventArgs e)
{
if (txtTimer.Text == "00:00")
{
MessageBox.Show("Please enter the time to start!", "Enter the Time", MessageBoxButtons.OK);
}
else
{
string[] totalSeconds = txtTimer.Text.Split(':');
int minutes = Convert.ToInt32(totalSeconds[0]);
int seconds = Convert.ToInt32(totalSeconds[1]);
timeLeft = (minutes * 60) + seconds;
btnStartTimer.Enabled = false;
btnCleartimer.Enabled = false;
txtTimer.ReadOnly = true;
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Start();
}
}
private void btnStopTimer_Click(object sender, EventArgs e)
{
timer1.Stop();
timeLeft = 0;
btnStartTimer.Enabled = true;
btnCleartimer.Enabled = true;
txtTimer.ReadOnly = false;
}
private void btnCleartimer_Click(object sender, EventArgs e)
{
txtTimer.Text = "00:00";
}
private void timer1_Tick(object sender, EventArgs e)
{
if (timeLeft > 0)
{
timeLeft = timeLeft - 1;
// Display time remaining as mm:ss
var timespan = TimeSpan.FromSeconds(timeLeft);
txtTimer.Text = timespan.ToString(@"mm\:ss");
// Alternate method
//int secondsLeft = timeLeft % 60;
//int minutesLeft = timeLeft / 60;
}
else
{
timer1.Stop();
SystemSounds.Exclamation.Play();
MessageBox.Show("Time's up!", "Time has elapsed", MessageBoxButtons.OK);
}
}
答案 0 :(得分:1)
您需要使用btnStopTimer_Click方法取消订阅该事件:
timer1.Tick -= timer1_Tick;
答案 1 :(得分:0)
您将在每次启动计时器时将事件添加到Count中。结果,第一次调用时只有一个事件,第二次只有两个事件,依此类推。结果,您首先下降了一秒钟,然后下降了两秒钟,.... 我建议单独创建计时器,只需调用“开始”和“停止”即可。 Alternativ,如果您不想在其他地方创建计时器,用户Dmitry Korolev回答了一个很好的方法
timer1.Tick -= timer1_Tick;