2013-01-12 165 views
1

我有一個WindowsForm應用程序 - 「彈跳球」,所以我有一個計時器的形式 ,因爲在每個刻度我移動球。什麼時候刪除C#中的Timer事件處理程序?

在我的形式c'tor我有這樣的代碼:

public Form1(){ 

    timer = new Timer(); 
    timerHandler = new EventHandler(timerTick); 
    timer.Tick += timerHandler; 
    timer.Enabled = true; 
} 

現在,當用戶關閉該應用程序,我需要刪除「事件處理程序」? 我有一個退出按鈕,所以當用戶點擊它時,我會向他展示一個彈出對話框,詢問他是否真的要退出應用程序。如果他點擊「是」,我將關閉應用程序,否則什麼都不會發生。

所以在我的退出按鈕的代碼我寫了這個代碼:

DialogResult result= MessageBox.Show("Do you really want to quit?", "Exit", 
            MessageBoxButtons.YesNo); 
     if (result == DialogResult.Yes) 
     { 
      timer.Tick -= timerHandler; 
      this.close(); 
     } 

我應該擔心的timerHandler或GC毀了他,當應用程序關閉?

+1

當用戶單擊應用程序時,所有對象都被銷燬(期望後臺線程),並且不需要擔心@ArsenMkrt –

+0

,謝謝! – Elior

回答

6

現在當用戶關閉這個應用程序時,我是否需要刪除'EventHandler'?

不,沒有必要。除此之外,如果整個應用程序正在停止,那意味着該進程將無法繼續,因此它無關緊要。

但即使的情況下不,計時器將有資格進行垃圾回收,同時爲形式反正 - 所以這不是在事件處理程序將保持一個對象的情況下,活得比它需要的時間更長。 (這是假設你的timer變量當然是一個實例變量。)

編輯:上面只是解決垃圾收集方面的東西。仔細想想,它可能是可能的(我不確定實現的細節)這裏有一個競爭條件:如果計時器在窗體關閉並隱式處理後但在事件循環停止運行之前進行滴答,你最終可能會遇到一個計時器滴答聲,它會試圖將球移動到一個已處理的格式上,這會失敗。

解決這個問題的最佳方法不是刪除滴答處理程序(IMO) - 它是在處理表單時處理定時器(即在Dispose方法中 - 可能通過將其添加到組件容器中,但我並不完全確定)。

這不是一個事情是否會被垃圾收集的問題 - 它是否會在不適當的時候調用事件處理程序(因爲表單已被處置)。如果表格關閉立即關閉事件循環,那很好 - 但我不確定。

+0

謝謝你的答案,所以我可以從代碼中刪除代碼行「timer.Tick - = timerHandler」嗎? – Elior

+0

@Elior:是的,沒有必要 - 至少在垃圾收集方面。我想進一步思考,如果這裏存在競爭條件,我會在我的答案中編輯更多細節。 –

+0

@John Skeet,謝謝你:),我會接受你的回答,我只是在等待這個選項對我來說是可能的,因爲我剛剛註冊了.. – Elior

相關問題