1

我有一个用 VS 2010 / .NET 4.0 编写的 Windows 服务。

该服务遵循以下代码片段的方案:使用计时器,它每几分钟执行一些所需的行为。每隔几分钟执行一次“期望行为”的要求现在已经发展为大约需要 10 秒的工作。

我在该服务中只需要一个线程,没有理由创建多个线程,这就是为什么我将 Windows 服务称为单线程。

我担心的是,如果有人通过管理控制台停止服务,那么服务可能只是在这 10 秒的工作中偶尔执行。

我已经阅读了一些关于 SO 以及如何停止服务的内容,但有点迷失了。有时会创建 WorkerThreads,有时会创建 ManualResetEvents,但到目前为止,我还不能完全掌握 Windows 服务的最佳前进方向。

我在想我需要在 10 秒执行期间检查某种标志,然后只有在该标志没有告诉我应该停止时才继续。在 onStop 方法中,我可能需要等到处理正确完成。

理论就这么多;),但是我最好的前进方式是什么,同时考虑下面的代码片段?

谢谢大家!

Public Class MyService
   Public _timer As System.Timers.Timer

   Protected Overrides Sub OnStart(ByVal args() As String)
       _timer = New System.Timers.Timer()
       'more timer settings
       AddHandler _timer.Elapsed, AddressOf _timer_Tick
       _timer.Start()
   End Sub

   Protected Overrides Sub OnStop()
   ' ????????????????????????
   End Sub

   Private Sub _timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
       SyncLock Me
           try
              _timer.Stop()
           catch ex as Exception            
           finally
              _timer.Start()
           end try
       End SyncLock
   End Sub
End Class
4

1 回答 1

1

只需锁定,以便 OnStop() 不能与 Elapsed 事件处理程序同时运行:

   Protected Overrides Sub OnStop()
       SyncLock Me
           _timer.Stop()
       End SyncLock
   End Sub

哪个可以竞争,Elapsed 事件处理程序可能已经计划运行但尚未进入锁定。因此,请验证计时器是否仍处于启用状态:

   Private Sub _timer_Elapsed(ByVal sender As Object, ByVal e As EventArgs)
       SyncLock Me
           If Not _timer.Enabled Return
           '' etc..

喜欢一个专用的锁对象而不是我。并注意服务控制器愿意在放弃之前等待的 30 秒,您正在接近。

于 2012-11-19T20:30:22.723 回答