Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 窗体计时器不';开始_C#_Timer_Countdowntimer - Fatal编程技术网

C# 窗体计时器不';开始

C# 窗体计时器不';开始,c#,timer,countdowntimer,C#,Timer,Countdowntimer,所以我刚开始学习C#和使用表单。我已经能够创建一个数字时钟并修补这个和那个,但现在我正试图为一个简陋的游戏创建一个基本的用户界面,我的计时器不工作 首先-我要完成的是:一个简单的从60秒开始递减的计时器(*时钟样式(mm:ss))。 第二,这是我所拥有的: public partial class Form1 : Form { private int counter = 60; public Form1() { InitializeComponent();

所以我刚开始学习C#和使用表单。我已经能够创建一个数字时钟并修补这个和那个,但现在我正试图为一个简陋的游戏创建一个基本的用户界面,我的计时器不工作

首先-我要完成的是:一个简单的从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();
    }
}

感谢您的反馈和知识

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

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()行已移动到
计数器==0
检查之前,因此它能够为所有计数器值提供反馈

此外,如果您没有跟踪使用
new Timer()
生成的实例数量,则可能会意外启动多个
timer1
实例。有多种方法可以做到这一点,但在创建新实例之前,您可以简单地检查
timer1
是否已经存在,以及
counter==0
。您可以将此检查作为一个保护子句来执行(即,如果符合这些条件之一,则返回)

如果希望此倒计时自动开始,可以直接将其放入构造函数中,或将其放入另一个方法中,然后从构造函数调用它,如下所示:

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

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

从我看到的代码来看,您的计时器正在工作,但您没有在每次计数中更新它,而是在计时器完成时更新-

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
版本


您可能希望将
timer1.Stop()
((Timer)sender)交换掉。Stop()
,否则您可以在同一秒内启动两个计时器,并且第一个计时器将永远不会调用Stop。您的计时器将只工作一次,因为计数器是全局定义的,一旦达到0,就没有重置机制,label1_Click工作正常。我更改了一些内容,使它从一个不同的数字开始,单击时转到1:00。问题是我不想点击它。我希望它能在窗户一打开就自动启动。你知道怎么做吗??斯科特-谢谢你的情报。@GeoffOverfield:请看我的editHey Groves,那真是太棒了!!谢谢你的帮助。当我有你的时候,让我再问一个问题:为了60秒的倒计时,我将计数器初始化为60。当它开始这个过程时,它从(m\\:ss)视图变成一个简单的两位数视图。如果我想从1:30开始逐步下降,我希望它按顺序下降(1:29,1:28,1:27等等…,而不是90,89,88…)。有没有一种方法可以使我不必初始化计数器变量的值60?
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
}