簡體   English   中英

禁用和啟用計時器會導致第二個實例?

[英]Disabling and enabling a timer causes a second instance?

我在表單上有一個“開始和停止”按鈕,用於啟動和停止將數據發送到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()方法中只是缺少了。

不,您只有一個計時器-每次您單擊開始時都向其中添加了一個事件處理程序:

query1Timer.Elapsed += new ElapsedEventHandler(doQuery1);

只要將那條線移動到構造計時器的任何位置,就只添加一次,就可以了。

(我個人將其重寫為query1Timer.Elapsed += doQuery1;但這是您的電話...)

每次按Start時,都會將事件處理程序添加到計時器中,但是在停止時,請勿將其刪除。

每次單擊開始時,您都在執行該行:

query1Timer.Elapsed += new ElapsedEventHandler(doQuery1);

每次調用時都會添加一個新的事件處理程序,從而導致多次執行doQuery1方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM