禁用和启用计时器会导致第二个实例?

Dev*_*ate 0 c# timer

我在窗体上有一个启动和停止按钮,用于启动和停止重复的SQL查询,该查询将数据发送到pubnub通道.当我启动表单并单击开始时,我看到了我对订阅客户端的期望.但是,如果我单击停止然后再次启动,我现在会获得重复数据.第三次给我三份数据,等等.是什么导致了这个?以下是启动和停止方法:

private void btnQuery1Start_Click(object sender, EventArgs e)
{

    lblQuery1Status.Text = "Status: Running";
    btnQuery1Start.Enabled = false;
    txtQuery1Interval.Enabled = false;
    btnQuery1Stop.Enabled = true;
    query1Timer.Elapsed += new ElapsedEventHandler(doQuery1);
    query1Timer.Interval = Convert.ToInt32(txtQuery1Interval.Text) * 1000;
    query1Timer.Enabled = true;

}
private void btnQuery1Stop_Click(object sender, EventArgs e)
{
    btnQuery1Start.Enabled = true;
    btnQuery1Stop.Enabled = false;
    txtQuery1Interval.Enabled = true;
    query1Timer.Enabled = false;
    lblQuery1Status.Text = "Status: Stopped";
}
Run Code Online (Sandbox Code Playgroud)

我可以发布,doQuery1如果有必要,但它使用OdbcConnection和数据读取器获得单个整数结果然后它序列化Newtonsoft.Json并使用它发送Pubnub.publish().我希望尽管这是显而易见的,我只是在btnQuery1Start_Click()上面的方法中遗漏了.

Jon*_*eet 6

不,你有一个计时器 - 但是你每次点击开始时都要为它添加一个事件处理程序:

query1Timer.Elapsed += new ElapsedEventHandler(doQuery1);
Run Code Online (Sandbox Code Playgroud)

只需将该行移动到构建计时器的任何位置,因此它只会添加一次,并且它会没问题.

(我个人会把它重写为query1Timer.Elapsed += doQuery1;,但那是你的电话......)