处理System.Timers.Timer的正确方法是什么?

时间:2011-04-18 18:36:29

标签: c# .net vb.net

我有一个Timer类的问题,因为你可能会在调用Dispose()之前调用一个定时器,因为你可能会从其他一些线程调用Dispose()。你可能有类似的东西:

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

然后从代码中的其他位置开始,当您的应用完成后,您可以调用

itsTimer.Dispose()

我能想到这样做的唯一方法是:

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

这不是一件好事。因为我正在处理我正在处理的物体上的锁定。我可以创建自己的锁和syncLock但是有一个简单的方法吗?

2 个答案:

答案 0 :(得分:2)

锁定SynchronizingObject不会阻止竞争条件。也不会取消注册tick事件。在这两种情况下,都可以在处理定时器后运行事件。

您需要在计时器之外定义一个共享状态,该状态在计时器事件处理程序的开头显式检查。我称之为asynchronous callback context

答案 1 :(得分:1)

在处理计时器之前

Unregister嘀嗒事件。

使用RemoveHandler取消注册事件处理程序。