Visual Basic〜服务未响应控制功能

时间:2018-07-19 11:47:04

标签: vb.net service

我正在尝试运行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运行整个代码,然后才能在另一台机器上进行测试,因此我不确定如何进行调试。考虑到服务立即崩溃,我什至没有时间将调试器附加到它。有没有办法将其附加到调试器?

1 个答案:

答案 0 :(得分:0)

您需要共享代码,尤其是在OnStart()方法中。我的猜测是该代码正在阻塞或长时间运行。在Windows认为问题发生之前,您只有30秒的时间来启动或停止服务。典型的方法是在OnStart中启动线程并在那里执行真正的业务逻辑。