2013-02-18 41 views
2

我已經在類級別中刪除了System.Timers.Timer對象並在constructor.started中創建了另一種方法中的定時器。GC.KeepAlive()和System.Timers.Timer

在已啓用的事件處理程序啓用屬性設置爲false並執行一些代碼,並再次啓用設置爲true。

我正在獲取每個層間的流逝事件。 問題是aftre過了一段時間停滯了。

我懷疑GC收集的計時器對象在已啓用事件hanler eventhadler中將啓用了momment的屬性設置爲false。

所以我想我的計時器對象設置爲保持活着。

我應該在我的項目中聲明GC.KeepAlive(timer)

回答

5

如果定時器是在類級別聲明的,它不會被GC自動收集,因爲它不會超出範圍。並且將Enabled設置爲false不會導致您描述的行爲。你的問題在別的地方。

我會懷疑你的事件處理程序中有一個異常。 System.Timers.Timer吞下事件處理程序中發生的異常,這意味着如果異常轉義了事件處理程序,則永遠不會知道它。

我懷疑你的代碼寫入與此類似:

myTimer.Enabled = false; 
// do stuff here 
myTimer.Enabled = true; 

如果異常在「做的東西在這裏」拋出的異常脫處理,永遠不會被重新啓用定時器,和定時器代碼吞噬異常,所以你永遠不會知道發生了什麼事情。

你應該寫你的事件處理程序是這樣的:

myTimer.Enabled = false; 
try 
{ 
    // do stuff here 
} 
catch (Exception ex) 
{ 
    // handle exceptions 
} 
finally 
{ 
    myTimer.Enabled = true; 
} 

通常要趕上只是特定的例外 - 你知道如何處理的人。捕捉上述所有例外通常是不好的做法。

+0

我知道這是一個老問題,但我有同樣的問題,但我有代碼包裝在try catch中,最終如這裏所建議的,它似乎仍然每隔一段時間都會停止。還有什麼可能導致這個? – 2018-01-17 15:20:03

+0

@AdamWilson Offhand,我想不出任何會導致這個問題的東西,除非其他一些代碼將'Enabled'設置爲'false'。我的建議是發佈一個包含相關代碼的問題。也許別人會有一些洞察力。 – 2018-01-17 21:51:17