-3

我试图找出如何在 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

4 回答 4

2

您不应该在 while 循环中启用计时器,并且绝对不应该在 while 循环中添加 eventlistner,因为这就是您的程序崩溃的原因,而且 timer.start() 也是我使用的,我不熟悉计时器.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();
        }
    }
}

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

于 2013-10-14T12:45:19.020 回答
1

您的(最近添加的)代码

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

包含一些问题:

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

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

于 2013-10-14T12:39:54.863 回答
1

现在最简单的方法:

while(true) {
    await Task.Delay (1000);
    DoSomething ();
}
于 2013-10-14T12:19:44.760 回答
0

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

TimerCallback tCb = Method;

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

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

等待一秒(dueTime)后,它将每秒(周期)运行一次方法。

于 2013-10-14T12:28:07.250 回答