【问题标题】:Disabling and enabling a timer causes a second instance?禁用和启用计时器会导致第二个实例?
【发布时间】:2016-08-31 13:55:34
【问题描述】:

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

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";
}

如有必要,我可以发布doQuery1,但它使用OdbcConnection 和数据读取器来获取单个整数结果,然后使用Newtonsoft.Json 对其进行序列化并使用Pubnub.publish() 发送它。我希望这很明显,我只是在上面的 btnQuery1Start_Click() 方法中丢失了。

【问题讨论】:

    标签: c# timer


    【解决方案1】:

    不,您只有一个计时器 - 但每次单击开始时都会向其添加事件处理程序:

    query1Timer.Elapsed += new ElapsedEventHandler(doQuery1);
    

    只需将该行移动到您构建计时器的任何位置,这样它只会添加一次,就可以了。

    (我会亲自将其改写为query1Timer.Elapsed += doQuery1;,但这是你的电话......)

    【讨论】:

    • 感谢您不仅告诉我出了什么问题,还告诉我如何解决它!我认为这是显而易见的。
    【解决方案2】:

    每次按下开始时,都会将事件处理程序添加到计时器,但停止时不会删除它。

    【讨论】:

      【解决方案3】:

      每次单击开始时,您都在执行该行:

      query1Timer.Elapsed += new ElapsedEventHandler(doQuery1);
      

      这会在每次调用时添加一个新的事件处理程序,从而导致您的 doQuery1 方法被多次执行

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-26
        • 1970-01-01
        • 1970-01-01
        • 2018-06-26
        • 2020-12-03
        相关资源
        最近更新 更多