我的代码有问题:
System.Windows.Forms.Timer Timer1 = new System.Windows.Forms.Timer();
int TimeCount;
private void button1_Click(object sender, EventArgs e)
{
Timer1.Interval = 1000;
Timer1.Enabled = true;
TimeCount = 0;
Timer1.Tick += new EventHandler(TimerEventProcessor);
}
private void TimerEventProcessor(Object sender, EventArgs myEventArgs)
{
TimeCount = TimeCount + 1;
}
private void button2_Click(object sender, EventArgs e)
{
Timer1.Enabled = false;
TimeCount = 0;
}
在第一次运行时,TimeCount将很好地执行步骤(1,2,3,4,5,....]
但是如果i button2停止,然后button1重新启动,则TimeCount步骤将执行(2,4,6,8,10,...)
然后如果我重复操作步骤将做(3,6,9,....)
如何使我的TimeCount int始终正确执行(1,2,3,4,5,....)?
这与事件处理程序委托的使用方式有关:
Timer1.Tick += new EventHandler(TimerEventProcessor);
这会将新处理程序(TimerEventProcessor
)添加到Tick
持有的委托方法列表中。因此,在每个刻度上,事件将循环遍历已注册的处理程序,并依次调用它们。
如果两次向Tick
添加一个方法,它将被调用两次。将其添加三遍,它将被调用三遍,依此类推。每次单击button1
时,都会在列表中添加另一个处理程序。
我建议将Timer1.Tick += new EventHandler(TimerEventProcessor);
移至加载事件(例如Form_Load
)或构造函数(public Form1()
)。您只需要注册处理程序once。
或者,在button2中,注销处理程序:
Timer1.Tick -= new EventHandler(TimerEventProcessor);