2011-04-18 75 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

相关问题