除非手动启动,否则服务不会停留

时间:2011-11-07 16:52:29

标签: vb.net service

所以我在VB.Net中创建了这个Windows服务,它所做的就是执行一些调用并坐在那里。 (什么都不做)

我已将它安装在测试机器上,当我手动启动时,它会启动。当我手动停止时,正确关闭(调用onStop)。

当我启动它并重新启动机器时,服务就像它应该启动一样,但是当我登录时,服务不再运行并且onStop从未显示为正在执行。

我使用管理员权限安装了该服务,因此这不应该是一个问题。

这就是我所拥有的:

Sub New()

    ' This call is required by the Windows Form Designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.

    '' Open our log file
    FileReader = New IO.StreamWriter("C:\test.txt", True)



    Log("Starting service...")

    '' Get the username from the process list (If explorer is open (Meaning a user is logged in)
    Dim ProcessList As System.Diagnostics.Process()
    ProcessList = System.Diagnostics.Process.GetProcesses()
    Dim Proc As System.Diagnostics.Process
    For Each Proc In ProcessList
        If Proc.ProcessName.ToLower() = "explorer" Then
            My.Settings.Username = GetProcessUserName(Proc)
            Exit For
        End If
    Next

    Log("Fetched user name: " & My.Settings.Username)
    Try
        '' Get the IP address of the machine
        Dim h As System.Net.IPHostEntry = System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName)
        My.Settings.IP = h.AddressList.GetValue(0).ToString

        '' Get the Machine Information
        My.Settings.MachineName = System.Environment.MachineName()

        '' Get the Operating System Version
        Dim osInfo As New FindOsInfo
        My.Settings.OS = osInfo.OsName.ToString().Replace(" ", "").Split("|")(0)

    Catch ex As Exception
        Log("Startup error: " & ex.Message)
    End Try


    '' Start server listen here


End Sub

'Protected Overrides Sub OnStart(ByVal args() As String)

'End Sub

Protected Overrides Sub OnStop()
    ' Add code here to perform any tear-down necessary to stop your service.
    Log("Closing down service...")
    FileReader.Close()

End Sub

    Public Sub Log(ByVal str As String)
        Dim time As DateTime = DateTime.Now
        FileReader.WriteLine("[" & time.ToString("G") & "] " & str)
        FileReader.Flush()
    End Sub

谢谢你的时间!

3 个答案:

答案 0 :(得分:2)

在自动启动期间可能会抛出异常,导致进程中止(并且服务停止)。

您需要向服务添加日志记录以确定异常的原因 - 解决原因并且您可以继续使用。

答案 1 :(得分:1)

问题很可能是因为没有交互式用户而重启机器时My.Settings.UserName什么都不是,所以你的陈述:

 Log("Fetched user name: " & My.Settings.Username)

正在抛出异常。您应该在以下时间之后移动所有代码:

Log("Starting service...")

在Try中,并在记录之前添加一个用户名测试:

If My.Settings IsNot Nothing AndAlso My.Settings.UserName IsNot Nothing Then
     Log("Fetched user name: " & My.Settings.Username)
Else
     Log("No interactive user")
End if

答案 2 :(得分:0)

如果您的服务在其OnStart处理过程中做了大量工作,那么该工作的某些部分可能会超时,因为它正在繁忙时执行,而许多其他进程正在启动。如果是这种情况,请尝试重新设计您的服务,以便在OnStart期间保持最低限度。启动计时器以在延迟之后触发,或者在一段时间后启动新线程以执行可能冗长的启动代码。这也将提高您所需服务的可能性,这些服务未明确声明服务配置中的依赖关系。

使用try / catch并以最小的方式记录意外异常是很好的环绕代码,具有最少的依赖性(例如,事件日志)。