2011-04-18 111 views
1

我有一個Timer類的問題,因爲在調用Dispose()之前有一個定時器會觸發的機會,因爲您可能會從某個其他線程調用Dispose()。你可能有這樣的事情:處理System.Timers.Timer的正確方法是什麼?

Public Sub TimerTick() Handles itsTimer.Elapsed 
    Do Something 
End Sub 

然後從代碼的其他地方,當你的應用程序做,你叫

itsTimer.Dispose() 

我能想到這樣做的唯一方法是:

Public Sub SomeMethod() 
    SyncLock(itsTimer.SynchronizingObject) 
     itsTimer.Dispose() 
    End SyncLock 
ENd Sub 

這不是一件好事情要做esp。因爲我正在鎖定我正在處理的對象。我可以創建自己的鎖和同步鎖,但有沒有簡單的方法?

回答

1

鎖定SynchronizingObject不會阻止競爭條件。也不會註銷tick事件。在這兩種情況下,都可能在定時器處理後運行一個事件。

您需要定義一個在定時器事件處理程序開始時顯式檢查的定時器之外的共享狀態。我稱之爲asynchronous callback context

1

Unregister處理定時器之前的滴答事件。使用RemoveHandler取消註冊事件處理程序。

+0

如何取消註冊「句柄」條款? – Denis 2011-04-18 18:43:52

+0

@Denis - 你沒有。用'AddHandler'註冊事件。 – Oded 2011-04-18 18:44:59

+0

實際上,即使使用Handles設置了事件,您也可以使用RemoveHandler取消註冊。 – 2011-04-18 19:13:58

相關問題