如何使用定时器在for循环中添加延迟

时间:2013-02-01 23:41:37

标签: c# timer sleep windows-applications

通过以下代码(timer2的间隔为1000)

private void timer1_Tick(object sender, EventArgs e) {
    timer7.Enabled=false;
    timer8.Enabled=false;
    lblTimer_Value_InBuildings.Text="0";
}

private void timer2_Tick(object sender, EventArgs e) {
    lblTimer_Value_InBuildings.Text=(int.Parse(lblTimer_Value_InBuildings.Text)+1).ToString();
}

我们无法在for循环中创建延迟

for(int i=1; i<=Max_Step; i++) { 
    // my code... 

    // I want delay here: 
    timer1.Interval=60000; 
    timer1.Enabled=true; 
    timer2.Enabled=true; 

    // Thread.Sleep(60000); // makes no change even if uncommenting
}

我是否取消注释Thread.Sleep(60000);行,我们发现lblTimer_Value_InBuildings中的timer2_Tick没有任何变化。

请您给我一个解决方案(有或没有计时器)?

3 个答案:

答案 0 :(得分:5)

你的计时器是你的循环,你不需要for循环。您只需跟踪函数调用之外的循环变量。我建议将所有这些功能包装到一个类中,以使其与GUI代码分开。

private int loopVar = 0;
public void Form_Load()
{
    // Start 100ms after form load.
    timer1.Interval = 100;
    timer1.Enabled = true;
}


private void timer1_Tick(object sender, EventArgs e)
{
   timer1.Enabled = false;
   //  My Code Here
   loopVar++;

   if (loopVar < Max_Step)
   {
      // Come back to the _tick after 60 seconds.
      timer1.Interval = 60000;
      timer1.Enabled = true;

   }
}

答案 1 :(得分:2)

当您执行Thread.Sleep(60000)时,您告诉UI线程休眠60秒。这样做也会阻止计时器的执行,因为UI线程挂起睡眠而不是处理诸如计时器睡眠之类的事件。

答案 2 :(得分:1)

这段代码让我觉得无聊

方法:

private void timer1_Tick(object sender, EventArgs e) {
    timer2.Enabled=false;
    timer1.Enabled=false;
    lblTimer_Value_InBuildings.Text="0";
}

private void timer2_Tick(object sender, EventArgs e) {
    lblTimer_Value_InBuildings.Text=(int.Parse(lblTimer_Value_InBuildings.Text)+1).ToString();
}

private void timer3_Tick(object sender, EventArgs e) {
    if(0!=(int)timer3.Tag) {
        // your code goes here and peformed per step
        timer1.Enabled=true;
        timer2.Enabled=true;
    }

    timer3.Tag=(1+(int)timer3.Tag)%Max_Step;
}

缩写:

var delayedInterval=60000;

timer1.Interval=60000;
timer2.Interval=1000;
timer3.Interval=delayedInterval+timer1.Interval;

lblTimer_Value_InBuildings.Text="0";
timer3.Tag=1;
timer3.Enabled=true;

您的原始代码永远不会停止timer1timer2,因此我认为您应该将timer7timer8更改为timer1timer2 ,否则他们在这里没有意义。