[英]Cleaning Up Timers?
以下代碼將表單隱藏10秒鍾。 沒什么太瘋狂的。 每次按下按鈕,它都會創建一個新的計時器對象,該對象不會停止並且只會繼續前進。 我的直覺告訴我,如果您最終多次按下該按鈕,那么當只有一個必要的計時器(或者我的假設不正確嗎?)時,將有很多計時器在運行。 另外,如果我確實需要停止並處置此計時器,我是否將其作為RevealForm中的參數發送,還是將計時器作為類級別的變量並每次都將其停止/重置?
private void ButtonHide_Click(object sender, EventArgs e) {
this.Visible = false;
System.Timers.Timer t = new System.Timers.Timer();
t.Elapsed += new ElapsedEventHandler(RevealForm);
t.Interval = 10000;
t.AutoReset = false;
t.Start();
}
private void RevealForm(object source, ElapsedEventArgs e) {
InvokeReveal();
}
private void InvokeReveal() {
if (InvokeRequired) {
Invoke(new Action(InvokeReveal));
}
else {
this.Visible = true;
}
}
非常感謝!
您的假設是正確的-測試會為您斷言如此。
您可以:
A)在每次執行后(按時間間隔)禁用計時器,並在點擊時啟用,或者
B)停止並銷毀計時器,並在每次單擊時創建一個新計時器。
兩種選擇都需要對現有代碼進行一些重構。
至於問題的第二部分,優先選擇如何停止計時器。 在這么小的應用程序中(如果整體上是它的功能),那么簡單地在事件處理程序(或相關方法)中停止計時器就可以解決問題,盡管要訪問Timer
實例,您可以在更高級別上聲明它在范圍內(即不受click事件處理程序范圍的約束)。
在該類中創建計時器,然后在每次單擊時調用t.start()。
無需破壞/清理/等。 只需回收您擁有的那一個即可。
通常,您要做的第一件事是在事件處理程序中停止計時器。
如果只需要一個計時器,然后將其設為表單級別變量,則在ButtonHide_Click中啟動它,然后在RevealForm方法的頂部,停止計時器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.