我一直在使用Visual Studio在C#中使用一个简单的倒数计时器,用于在一段时间后关闭应用程序。
但是,现在我运行的只是Windows窗体上的倒计时显示。
我的问题是当踩到每一块时,逻辑似乎是合理的,秒数倒计时,分钟计数秒数达到0等等。
然而,问题是在一秒钟之后,文本框显示剩余时间从“剩余1分59秒”变为“剩余1分1秒”,并且似乎只是挂在那里,不管我有多久让应用程序运行。
我在逻辑中遗漏了什么?
提前谢谢大家。
以下是代码:
int i_minutes = 1;
int i_seconds = 59;
public TestTimer()
{
InitializeComponent();
lb_TimeRemaining.Text = String.Format("{0} minutes {1} seconds remaining", i_minutes.ToString(), i_seconds.ToString());
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
//while the timer ticks
while (i_seconds != 0 && i_minutes != 0)
{
//if the seconds reaches 0, subtract a minute
if(i_seconds == 0)
{
i_minutes = i_minutes - 1;
//if the minutes are still not below 0, reset the seconds to 59
if (i_minutes >= 0)
{
i_seconds = 59;
}
}
//add a zero to seconds if its below 10
//so it displays such as 09, 08, etc
if (i_seconds < 10 && i_minutes != 0)
{
lb_TimeRemaining.Text = String.Format("{0} minutes 0{1} seconds remaining", i_minutes, i_seconds);
}
//if seconds are above 10, but minutes below 0, display as 0 minutes and seconds
else if (i_minutes < 0)
{
lb_TimeRemaining.Text = String.Format("0 minutes {1} seconds remaining", i_minutes, i_seconds);
}
//if the minutes are above 0, and seconds above 10, display as such
else
{
lb_TimeRemaining.Text = String.Format("{0} minutes {1} seconds remaining", i_minutes, i_seconds);
}
i_seconds = i_seconds - 1;
}
}
}
答案 0 :(得分:2)
此行是您的错误,问题已在您的评论
中准确说明//while the timer ticks
while (i_seconds != 0 && i_minutes != 0)
不,这不允许计时器再次打勾,因为您输入的循环仅在您的一个变量达到零之后退出。
这不会发生,因为会引发新的tick事件,但会根据您的计算在循环内部发生。所需时间可能远低于一秒钟。最后,到达事件处理程序的末尾,并使用while循环中计算的最后一个值更新标签。
您应该允许Tick事件结束并将控件释放到您的操作系统,以便能够更新标签
将该行更改为
if (i_seconds != 0 && i_minutes != 0)
{
....
}
现在您的代码退出事件处理程序,操作系统更新标签,并根据Interval属性中设置的值引发新的Tick事件