簡體   English   中英

清理計時器?

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

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