C#计时器我可以加速但不会减速

时间:2013-11-06 19:04:46

标签: c# timer

我有一个计时器事件设置,我想通过从文本框中读取一个数字来改变计时器事件发生的频率。如果该框为“10”并且您单击更新按钮,则事件将每10ms触发一次,如果您更改为“100”并单击它将每100ms发生一次,依此类推。

然而,当我运行程序时,我可以加快事件频率(例如100ms到10ms)但我不能减慢速度(例如10ms到100ms)。以下是我单击时更改计时器的代码:

    private void TimerButton_Click(object sender, EventArgs e)
    {

        getTime = ImgTimeInterval.Text;
        bool isNumeric = int.TryParse(ImgTimeInterval.Text, out timerMS); //if number place number in timerMS
        label2.Text = isNumeric.ToString();
        if (isNumeric)
        {
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Enabled = false;
            timer.Interval = timerMS;
            timer.Elapsed += new ElapsedEventHandler(timerEvent);
            timer.AutoReset = true;
            timer.Enabled = true;
        }
    }

    public void timerEvent(object source, System.Timers.ElapsedEventArgs e)
    {
        label1.Text = counter.ToString();
        counter = (counter + 1) % 100;
    }

如果有人知道我的错误,我们将不胜感激。

3 个答案:

答案 0 :(得分:4)

此代码的问题是,每次单击按钮时都会创建一个新的Timer。尝试在方法外创建计时器。您认为它只会更快,但多个计时器会触发timerEvent

private System.Timers.Timer _timer;

private void CreateTimer()
{
    _timer = new System.Timers.Timer();
    _timer.Enabled = false;
    _timer.Interval = 100;  // default
    _timer.Elapsed += new ElapsedEventHandler(timerEvent);
    _timer.AutoReset = true;
    _timer.Enabled = true;    
}

private void TimerButton_Click(object sender, EventArgs e)
{
    bool isNumeric = int.TryParse(ImgTimeInterval.Text, out timerMS); //if number place number in timerMS
    label2.Text = isNumeric.ToString();
    if (isNumeric)
    {
        _timer.Interval = timerMS;
    }
}

public void timerEvent(object source, System.Timers.ElapsedEventArgs e)
{
    label1.Text = counter.ToString();
    counter = (counter + 1) % 100;
}

确保在构造函数/ formload中调用CreateTimer。此外,您现在可以在另一个按钮事件中停止计时器。使用_timer.Enabled = false;

答案 1 :(得分:2)

您总是创建一个新的计时器,永远不会停止旧计时器。当你将它从100“改变”到10时,你的100ms定时器仍然每100毫秒发射一次,所以每100ms两个定时器大约在同一时间发射。

您需要“记住”旧计时器,以便您可以停止它。或者,更好的是,只有一个计时器可以更改间隔。

private System.Timers.Timer timer = new System.Timers.Timer();
public Form1()
{
    timer.Enabled = false;
    timer.AutoReset = true;
    timer.Elapsed += timerEvent;
}

private void TimerButton_Click(object sender, EventArgs e)
{
    getTime = ImgTimeInterval.Text;
    bool isNumeric = int.TryParse(ImgTimeInterval.Text, out timerMS); //if number place number in timerMS
    label2.Text = isNumeric.ToString();
    if (isNumeric)
    {
        timer.Interval = timerMS;
        timer.Enabled = true;
    }
}

答案 2 :(得分:1)

基本问题是你每次都要建立一个新的。制作私人计时器:

private System.Timers.Timer _timer = new System.Timers.Timer();

然后在单击按钮时将其修复:

if (isNumeric)
{
    _timer.Stop();
    _timer.Interval = timerMS;
    _timer.Start();
}

然后在.ctor中执行此操作:

_timer.Elapsed += new ElapsedEventHandler(timerEvent);

现在,您只需要修改一个计时器,因为用户更改了文本框中的值。

相关问题