表单计时器无法启动

时间:2015-03-22 05:44:45

标签: c# timer countdowntimer

所以我刚开始学习C#并使用表格。我已经能够创建一个数字时钟并修补这个和那个,但现在我正在尝试为一个derpy游戏制作一个基本的UI,我的计时器不起作用。

首先 - 我想要完成的事情:一个简单的递减计时器,从60秒开始(*时钟样式(mm:ss))。
第二,这就是我所拥有的:

public partial class Form1 : Form
{
    private int counter = 60;
    public Form1()
    {
        InitializeComponent();
        label1.Text = TimeSpan.FromMinutes(1).ToString("m\\:ss");
    }

    private void pictureBox2_Click(object sender, EventArgs e)
    {

    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        counter--;
        if (counter == 0)
        {
            timer1.Stop();
            label1.Text = counter.ToString();
            MessageBox.Show("Time's Up!!");
        }
    }

    private void label1_Click(object sender, EventArgs e)
    {
        var startTime = DateTime.Now;
        var counter = (TimeSpan.FromMinutes(1)).ToString("m\\:ss");
        timer1 = new Timer();
        timer1.Tick += new EventHandler(timer1_Tick);
        timer1.Interval = 1000;
        timer1.Start();
        label1.Text = counter.ToString();
    }
}

欣赏反馈和知识!

2 个答案:

答案 0 :(得分:1)

这对我来说很好。我会给进度更新,因为时间倒计时表明它正在运行。例如,如果您在标签中执行此操作,则可以执行以下操作:

private void timer1_Tick(object sender, EventArgs e)
{
    counter--;
    label1.Text = counter.ToString();
    if (counter == 0)
    {
        timer1.Stop();
        MessageBox.Show("Time's Up!!");
    }
}

请注意label1.Text = counter.ToString();行已在counter == 0检查之前移动,以便能够为所有计数器值提供反馈。

同样,如果您没有跟踪使用timer1生成的实例数,可能会意外启动多个new Timer()个实例。有多种方法可以执行此操作,但您可以在创建新实例之前检查timer1是否已存在以及counter == 0。您可以将此检查作为保护条款执行(即。return如果其中任何一个条件匹配)。

private void label1_Click(object sender, EventArgs e)
{
    var startTime = DateTime.Now;
    if (timer1 == null || (timer1 != null && counter == 0)) return;
    counter = (TimeSpan.FromMinutes(1)).ToString("m\\:ss");
    timer1 = new Timer();
    timer1.Tick += new EventHandler(timer1_Tick);
    timer1.Interval = 1000;
    timer1.Start();
    label1.Text = counter.ToString();
}

如果你想让这个倒计时自动启动,你可以把它直接放到构造函数中,或者把它放到另一个方法中并从构造函数中调用它,如下所示:

public Form1()
{
    InitializeComponent();
    StartCountdown();
}

private void StartCountdown()
{
    var startTime = DateTime.Now;
    /* the rest of your original label1_Click code goes here ... */
}

答案 1 :(得分:1)

从我看到的代码中,你的计时器正在运行,但你没有在每次计数中更新它,你在计时器结束时更新 -

private void timer1_Tick(object sender, EventArgs e)
{
    counter--;
    if (counter == 0)
    {
        timer1.Stop();
        label1.Text = counter.ToString(); // *** Look here
        MessageBox.Show("Time's Up!!");
    }
}

您应该在每个刻度中更新计时器,因此请从if块中取出更新标签代码 -

private void timer1_Tick(object sender, EventArgs e)
{
    counter--;
    label1.Text = counter.ToString(); // should work
    if (counter == 0)
    {
        timer1.Stop();
        MessageBox.Show("Time's Up!!");
    }
}

并在每个周期中重置计数器 -

private void label1_Click(object sender, EventArgs e)
{
    var startTime = DateTime.Now;

    var counter = (TimeSpan.FromMinutes(1)).ToString("m\\:ss");
    timer1 = new Timer();
    timer1.Tick += new EventHandler(timer1_Tick);
    timer1.Interval = 1000;
    timer1.Start();
    label1.Text = counter.ToString();
    this.counter = 60
}
  

注意:我真的不确定此代码是否会引发任何访问   由于在不同线程中更新UI而导致的违规错误。   如果是这样,那么您必须使用async / await或事件/代表   更新用户界面。

     

请告诉我,如果这会引发错误,那么我会给你async/await版本。