定时器不起作用

时间:2015-01-16 12:12:27

标签: c# timer

我是第一次使用计时器,所以我可能做错了。

我的代码是这样的:

 private void timer1_Tick(object sender, EventArgs e)
    {
        button2.PerformClick();
    }

    private void button2_Click(object sender, EventArgs e)
    {

        // random code here
            timer1.Interval = 5000;
           timer1.Start();
           timer1_Tick(null,null);

    }

我想要做的是:执行随机代码,然后等待定时器间隔并执行Tick(这将再次点击按钮,再次执行相同的操作) ,并永远重复这一点。

对不起,如果这是一个容易犯的错误,我从这开始就不知道自己做错了什么。

谢谢你的阅读! :d

3 个答案:

答案 0 :(得分:2)

您不需要手动调用Timer事件(适用于各种计时器)。

设置其事件处理程序方法,设置间隔并启动它 在需要调用时,底层框架会调用您的Tick事件。

因此,您需要将随机代码放在可以从Tick事件和按钮点击事件中调用的子字段中。此外,您应该考虑阻止进一步激活计时器。您可以禁用该按钮,当您完成随机代码且条件为真时,请停止计时器并重新启用该按钮。

private void button2_Click(object sender, EventArgs e)
{
    stopTheTimer = false;
    YourCommonMethod();
    button2.Enabled = false;
    timer1.Tick += timer1_Tick
    timer1.Interval = 5000;
    timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    YourCommonMethod();
}
private void YourCommonMethod()
{
    // execute your 'random' code here
    if(stopTheTimer)
    {
        timer1.Stop();
        timer1.Tick -= timer1_Tick;  // disconnect the event handler 
        button2.Enabled = true;
    }
}

答案 1 :(得分:1)

你走了。 。 。

private void button2_Click(object sender, EventArgs e)
    {
        // random code here
        timer1.Interval = 5000;
        timer1.Start();
        timer1.Tick += timer1_Tick;

    }

    void timer1_Tick(object sender, EventArgs e)
    {
        //Your timing code here.
    }

答案 2 :(得分:1)

仅将一次连接到Tick()事件,最好通过IDE连接,这样就不会有多个处理程序,并且每个Tick()事件都会运行多次代码。

*在下面的示例中,我已将其作为替代方案在构造函数中进行了连接...但是不要这样做通过IDE连接它,否则每次会触发两次蜱()。

您可能只想在Button处理程序中调用Start(),然后在Tick()事件中调用“随机代码”,如下所示:

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
        timer1.Enabled = false;
        timer1.Interval = (int)TimeSpan.FromSeconds(5).TotalMilliseconds;
        timer1.Tick += timer1_Tick; // just wire it up once!
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (!timer1.Enabled)
        {
            Foo(); // <-- Optional if you want Foo() to run immediately without waiting for the first Tick() event
            timer1.Start();
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        timer1.Stop();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        Foo();
    }

    private void Foo()
    {
        Console.WriteLine("Random Code @ " + DateTime.Now.ToString());
    }

}

这与其他答案差别不大,但多次连接Tick()事件是一个严重的缺陷......