如何在c#中使用定时器

时间:2013-10-14 12:06:32

标签: c# .net

我试图了解如何在C#中使用Timer,但我从未真正理解任何教程。 我想得到一个等待一秒然后做某事的循环(不是Thread.Delay。可以在其他事情发生时同时运行的东西)。如果有人可以告诉我如何编写代码或给我一个样本,那个初学者可以理解我会非常感激。

    public partial class Char1 : Form
{
    private static System.Timers.Timer aTimer;
    public static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        Mainprog.count += 1;
    }
    public Char1()
    {
        InitializeComponent();
    }

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        while (checkBox1.Checked)
        {
            aTimer.Interval = 2000;
            aTimer.Enabled = true;
            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

        }
    }
}

我试图让它每2秒调用一次事件,但它会崩溃。关于如何解决这个问题的任何想法?

4 个答案:

答案 0 :(得分:2)

你不应该在while循环中启用计时器,你绝对不应该在while循环中添加eventlistners,因为这就是你的程序崩溃的原因,也是我使用的timer.start(),我不是熟悉timer.enable尝试这样:

public partial class Char1 : Form
{
    private System.Timers.Timer aTimer;

    public static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        Mainprog.count += 1;
    }
    public Char1()
    {
        InitializeComponent();
        aTimer = new Timer();
        aTimer.Interval = 2000;
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    }

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if(checkBox1.Checked)
        {
            aTimer.Start();
        }
        else
        {
            aTimer.Stop();
        }
    }
}

在构造函数中实例化你的计时器,并在那里定义你的间隔,除非你想在选中或取消选中复选框时更改你的间隔。

答案 1 :(得分:1)

现在最简单的方式:

while(true) {
    await Task.Delay (1000);
    DoSomething ();
}

答案 2 :(得分:1)

您(最近添加的)代码

    while (checkBox1.Checked)
    {
        aTimer.Interval = 2000;
        aTimer.Enabled = true;
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    }

包含一些问题:

  • 选中复选框后,您将进入无限循环(您没有时间取消选中该框)
  • 在该循环中,您不断向计时器添加(+=)个新的事件处理程序,这样,如果它被触发,您将触发数千个OnTimedEvent个电话。

解决方案:将while替换为if,并确保只需将OnTimedEvent添加一次,方法是将该行移动到表单的构造中。

答案 3 :(得分:0)

你可以使用TimerCallback和timer在另一个线程中运行一个方法,如下所示:

TimerCallback tCb = Method;

        Timer t = new Timer(tCb, null, 1000, 1000);         
    }

    private void Method(object sender)
    {       
       //your
    }

等待一秒钟(dueTime)后,它将每秒(句点)运行一次。