我正在与两个计时器合作:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace example
{
public partial class Form1 : Form
{
int i = 0;
int j = 0;
public Form1()
{
InitializeComponent();
timer1.Interval = 3000;
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
i++;
timer2.Enabled = true;
if (i < 3)
time1(i);
else
timer1.Enabled = false;
}
private void timer2_Tick(object sender, EventArgs e)
{
j++;
timer2.Interval = timer1.Interval / 5;
if (j < 5)
time2(j);
else
timer2.Enabled = false;
}
private void time1(int i)
{
MessageBox.Show(i.ToString(), "First Timer");
}
private void time2(int j)
{
MessageBox.Show(j.ToString(), "SecondTimer");
}
}
}
运行此程序时,它会输出如下输出:
消息框中的firsttimer:1个
secondTimer:1个
secondTimer:2个
secondTimer:3个
secondTimer:4个
第一时间:2
。
但是在调试时,调试无法按此顺序移动。完成 secondtimer:2 后,它会回到第一个计时器。但是我需要像没有断点一样以相同的顺序进行调试 我在另一个应用程序中需要这个。为什么会这样?
答案 0 :(得分:2)
问题是,即使您使用断点停止程序,基础计时器仍将继续执行。您正在使用的System.Windows.Forms.Timer
将触发另一个事件(而System.Timers.Timer
将继续触发大量事件)。您可以自己尝试:
将计时器设置为例如3000ms并在其事件处理程序中设置断点:
private void timer1_Tick( object sender, EventArgs e )
{
// insert breakpoint here
}
等待~3秒才能继续你的程序。将立即再次调用事件处理程序。下次等待更长时间(~10秒),结果相同 - 事件处理程序将立即触发一次,然后在~3秒后触发。将行为与System.Timers.Timer
进行比较,这将在您的第二个测试用例中多次触发事件。
那么,根据你的断点(你在timer1_Tick
之前或之后的timer2.Enabled = true;
中设置它吗?)并且在你继续执行之前停止你的程序时你会得到不同的结果。
不幸的是,你无能为力。在你的特殊情况下,你可以在设置断点之前停止所有计时器,例如:
private static void Break()
{
var timer1Enabled = timer1.Enabled;
var timer2Enabled = timer2.Enabled;
timer1.Stop();
timer2.Stop();
// insert breakpoint here
timer1.Enabled = timer1Enabled;
timer2.Enabled = timer2Enabled;
}
但这会重新启动计时器,timer1和timer2间隔之间的比例会出错。
有关.net计时器的更多信息,请阅读this article。
答案 1 :(得分:0)
可能是因为你在调试?
尝试将间隔乘以10,这样您就可以手动密切关注代码,就像没有步进一样。
可怕的英语顺便说一下。我甚至不知道我在这里是否理解你。
答案 2 :(得分:0)
当您调试应用程序时,您不能依赖定时器以正确的间隔触发,因为程序可能在断点处停止。尝试删除所有断点,看看定时器是否在调试时工作。