简单的倒计时应用程序C#无法正确显示

时间:2016-01-30 15:41:53

标签: c# winforms visual-studio

我一直在使用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;
        }
    }
}

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事件