我有一个应用程序,它从Web数据库中读取一些数据并定期更新本地数据库。每隔5分钟说一次。
这是一个交互式Windows应用程序的形式。但由于此应用程序必须连续运行,我们决定制作Windows服务应用程序。
我们在应用程序中使用了定时器,它们被设置为5分钟的间隔,并且在计时器的每个滴答中,我们都在检查Web更新。
我们在服务中也做了同样的事情。但似乎计时器现在没有运行。以下是该服务的几种方法:
Protected Overrides Sub OnStart(ByVal args() As String)
' Add code here to start your service. This method should set things
' in motion so your service can do its work.
'connect to sap business one
If Connect("rlap1", "sa", "dracula", "UnimaxNew", "manager", "manager") = False Then
End
SyncEvents.WriteEntry("Unable to connect to SAP Business One, " & oCompany.GetLastErrorDescription, EventLogEntryType.Error)
Else
SyncEvents.WriteEntry("Connected to SAP Business One.", EventLogEntryType.Information)
End If
'start the timers
WebTimer.Start()
SapTimer.Start()
DataTimer.Start()
SyncEvents.WriteEntry("Synchronization process started.")
End Sub
Protected Overrides Sub OnStop()
' Add code here to perform any tear-down necessary to stop your service.
oCompany.Disconnect()
SyncEvents.WriteEntry("Disconnected from SAP Business One.", EventLogEntryType.Information)
'stop the timers
WebTimer.Stop()
SapTimer.Stop()
DataTimer.Stop()
SyncEvents.WriteEntry("Synchronization process stopped.")
End Sub
Private Sub WebTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles WebTimer.Tick
SyncEvents.WriteEntry("Checking for new orders.")
CheckOrder()
End Sub
Private Sub SapTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SapTimer.Tick
SyncEvents.WriteEntry("Checking for new deliveries.")
CheckDelivery()
End Sub
Private Sub DataTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataTimer.Tick
SyncEvents.WriteEntry("Checking for stock updates.")
CheckStock()
End Sub
消息在事件日志中正确记录 - 当我们启动或停止服务时。但是定时器功能没有消息。我也试过调试服务 - 在Visual Studio中使用Attach To Process ..但是,即使代码从未在任何tick函数中破坏。
我们不能在服务中使用计时器吗?如果不是,那么另一种方式是什么。如果是的话,这里可能出现什么问题?
由于 Rahul Jain
答案 0 :(得分:0)
没有什么可以阻止计时器在Windows服务中工作。听起来像是计时器没有配置为自动重置,但是不知道你正在使用什么计时器(System.Timers.Timer?System.Threading.Timer?Other?)以及它是如何配置的,它是不可能知道的肯定的。
关于调试服务,在OnStart()方法中放入以下代码“programmatic breakpoint”:
System.Diagnostics.Debugger.Break();
启动服务时,系统会提示您输入调试会话,执行将在此行中断。你可以从那里正常调试。