我正在尝试运行Visual Basic服务。
安装和卸载服务可以正常工作,但是,当尝试通过任务管理器启动服务时,将显示以下错误消息:
Unable to start service
The operation could not be completed.
The service did not respond to the start or control request in a timely fashion.
在事件查看器中,与此有关的以下错误消息被记录:
A timeout was reached (30000 milliseconds) while waiting for the ABC service to connect.
The ABC service failed to start due to the following error:
The service did not respond to the start or control request in a timely fashion.
尝试使用以下命令通过cmd启动服务:
net start "ABC"
...导致以下错误消息:
The service is not responding to the control function.
More help is available by typing NET HELPMSG 2186.
无奈地,键入“ NET HELPMSG 2186”只会重复错误消息的前半部分:
The service is not responding to the control function.
我已经看过该服务的源代码,但是我对它的体系结构不太熟悉。但是,我可以确定一些我认为与该服务相关的功能,即:
OnStart(String())
OnStop()
New()
到目前为止,从我从相关线程中收集的信息来看,错误消息可能意味着该服务没有适当的功能要由服务控制功能解决。可能是这种情况吗?
如果没有,您会建议采用哪种方法进行调试?
其他信息(2018年7月21日):
这是OnStart方法的样子:
Protected Overrides Sub OnStart(ByVal args() As String)
Dim log As ILogger = CommonObjectFactory.instance.buildLogger(LogName.ABCDSys).open("OnStart")
Dim oCallback As Threading.TimerCallback = Nothing
Try
Dim numTimeDuration As Integer = 30000
Try
'numTimeDuration = Convert.ToInt32(ABCDA.ABCProperties.Instance.GetValue("DTimer", "DSys", "5000"))
Dim config As IDServiceConfiguration = CommonObjectFactory.instance.buildConfigurationFactory().buildDSConfiguration()
numTimeDuration = config.DTimer
Catch ex As Exception
log.error(ex)
End Try
log.info("Setting up a " & numTimeDuration / 1000 & " second timer")
oCallback = New Threading.TimerCallback(AddressOf TimerEvent)
_timer = New System.Threading.Timer(oCallback, Nothing, numTimeDuration, numTimeDuration)
Catch ex As Exception
log.error(ex)
End Try
log.close()
log = Nothing
End Sub
据我所知,此服务应每30秒检查一次文档,从代码中可以看到的情况来看。
但是,当尝试启动该服务时,它会立即崩溃。即使事件日志中的错误消息显示“已达到超时(30000毫秒)”,也不会在30秒后立即显示。实际上,此服务在30秒后崩溃之前就遇到了问题,但是在所有这些情况下,它都在其中一个日志中写了一条有用的错误消息。现在,甚至都没有创建日志。
我想知道日志是否有问题。那就是这一行,对吧?
Dim log As ILogger = CommonObjectFactory.instance.buildLogger(LogName.ABCDSys).open("OnStart")
对我来说,调试它的最佳方法是什么?由于公司的工作流程,我无法在开发机器上进行测试,但是必须先通过TeamCity运行整个代码,然后才能在另一台机器上进行测试,因此我不确定如何进行调试。考虑到服务立即崩溃,我什至没有时间将调试器附加到它。有没有办法将其附加到调试器?
答案 0 :(得分:0)
您需要共享代码,尤其是在OnStart()方法中。我的猜测是该代码正在阻塞或长时间运行。在Windows认为问题发生之前,您只有30秒的时间来启动或停止服务。典型的方法是在OnStart中启动线程并在那里执行真正的业务逻辑。