C# 如何使用计时器在for循环中添加延迟

C# 如何使用计时器在for循环中添加延迟,c#,timer,sleep,windows-applications,C#,Timer,Sleep,Windows Applications,按照代码,时间间隔R2为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_InBuildi

按照代码,时间间隔R2为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.Sleep60000行的注释;或者没有,我们在timer2的构建中没有看到任何变化


你能给我一个有计时器或没有计时器的解决方案吗?

当你执行Thread.Sleep60000时,你是在告诉UI线程睡眠60秒。这也会阻止计时器的执行,因为UI线程挂起休眠而不是处理计时器休眠之类的事件。

您的计时器就是您的循环,您不需要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;

   }
}

代码让我觉得很无聊

方法:

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;

您的原始代码从未使timer1和timer2停止,因此我认为您应该将timer7和timer8更正为timer1和timer2,否则它们在这里没有意义

谢谢你的关注,兄弟,但这不是答案。请用评论替换它@月光,嗯,这显然是一个答案。另外,他告诉你的是错误的,这一点非常正确。对不起@MoonLight,下次我会尽量不告诉你为什么你的代码不起作用。“我将为您完成所有工作。@BrianRasmussen根据上下文,这些似乎是WinForms/WPF计时器,而不是线程计时器。因此,是的,如果从UI线程调用睡眠,则在睡眠完成之前不会执行计时器,因为UI没有处理消息。我不明白,timer3的好处是什么——意味着代码中的延迟在哪里?您的代码显示它是winform应用程序,也就是说,您的UI线程具有SynchronizationContext。计时器的工作原理解释起来有点复杂,但睡眠线程只会阻塞其他线程,而这些线程希望与它同步对象。