C# 如何使用计时器在for循环中添加延迟
按照代码,时间间隔R2为1000C# 如何使用计时器在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
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。计时器的工作原理解释起来有点复杂,但睡眠线程只会阻塞其他线程,而这些线程希望与它同步对象。