如何在不同的时间间隔内使用相同的计时器?

时间:2010-12-17 08:16:04

标签: c# winforms

我在我的代码中使用了一个计时器。状态栏在点击事件中更新,点击属性中提到的时间间隔的相应按钮,例如一秒钟。现在我想在不同的时间间隔内使用相同的计时器,例如两秒钟进行不同的操作。如何实现?

4 个答案:

答案 0 :(得分:6)

创建第二个计时器。黑客攻击第一个计时器没有任何好处。

正如@Henk所说,计时器并不昂贵。 (特别是没有比较难以维护代码!)

答案 1 :(得分:2)

我同意@Henk和其他人的意见。

但是,这样的事情仍然有效:

实施例

    Int32 counter = 0;

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (counter % 1 == 0)
        {
            OnOneSecond();
        }

        if (counter % 2 == 0)
        {
            OnTwoSecond();
        })

        counter++;
    }

更新示例

private void Form_Load()
{
    timer1.Interval = 1000; // 1 second
    timer1.Start(); // This will raise Tick event after 1 second
    OnTick(); // So, call Tick event explicitly when we start timer
}

Int32 counter = 0;

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

private void OnTick()
{
    if (counter % 1 == 0)
    {
        OnOneSecond();
    }

    if (counter % 2 == 0)
    {
        OnTwoSecond();
    }

    counter++;
}

答案 2 :(得分:0)

更改计时器间隔属性。

答案 3 :(得分:0)

在每个已用时间更改Interval属性。例如,该程序处理数据30秒,睡眠10秒。

static class Program
{
    private System.Timers.Timer _sleepTimer;
    private bool _isSleeping = false;
    private int _processTime;
    private int _noProcessTime;

    static void Main()
    {
        _processTime = 30000; //30 seconds
        _noProcessTime = 10000; //10 seconds

        this._sleepTimer = new System.Timers.Timer();

        this._sleepTimer.Interval = _processTime;
        this._sleepTimer.Elapsed += new System.Timers.ElapsedEventHandler(sleepTimer_Elapsed);

        ProcessTimer();

        this._sleepTimer.Start();
    }

    private void sleepTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        ProcessTimer();
    }

    private void ProcessTimer()
    {
        _sleepTimer.Enabled = false;

        _isSleeping = !_isSleeping;

        if (_isSleeping)
        {
            _sleepTimer.Interval = _processTime;

            //process data HERE on new thread;
        }
        else
        {
            _sleepTimer.Interval = _noProcessTime;
            //wait fired thread and sleep
            Task.WaitAll(this.Tasks.ToArray());
        }
        _sleepTimer.Enabled = true;
    }
}