[英]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.