2010-11-04 48 views
1

更新:定時器是一個System.Threading.Timer。精簡版框架:Timer.Dispose未被阻止

我們有一個在Timer Tick上更新的UI控件。在處理我們的控件時,我們調用timer.Dispose()。當定時器在調用UI控件後觸發時,偶爾會遇到ObjectDisposedOExceptions。

我看到這個在msdn docs

「回調的Dispose()方法重載調用後可能會發生,因爲計時器隊列回調由線程池中的線程執行可以利用的Dispose(WaitHandle的)方法重載等到所有回調完成。「

但是,Compact Framework無法訪問該重載方法。

這種情況的最佳解決方法是什麼?有沒有辦法讓我們的Dispose方法阻塞,直到定時器完全丟棄?其他建議?

謝謝!

回答

0

我不確定這是一個好主意,以阻止處置。有許多事情可能會使事情處於不潔的狀態。

相反,我會檢查您的計時器回調爲空的控件。或者,你可以把你的計時器回調放在一個try塊中,並捕獲ObjectDisposedException,但是這會消耗更多的資源(異常拋出/捕獲非常昂貴)。

這應該只發生到線程池中的線程耗盡聽起來好像沒有真正的問題,如果計時器發出幾次信號,但由於控制器爲空而沒有做任何工作。

+0

我們試着檢查控件是否處於回調狀態。這並沒有幫助 - 我們可以告訴控制權的最佳狀態是在我們實際處於回調方法內時處置的。 – Steve 2010-11-04 23:29:41