【问题标题】:Service not staying on unless started manually除非手动启动,否则服务不会继续运行
【发布时间】:2011-11-07 16:52:29
【问题描述】:

所以我在 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

感谢您的宝贵时间!

【问题讨论】:

  • 您是否在 Windows (services.msc) 中将服务设置为“自动”?
  • 是的,它设置为自动。我很抱歉没有具体说明。

标签: vb.net service


【解决方案1】:

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

您需要向服务添加日志记录以确定异常的原因 - 解决原因,您就可以开始了。

【讨论】:

  • 我有一个基于文件的日志记录,但是我感觉这不是您所指的日志记录类型。你会碰巧有一个链接到一个展示“正确”日志记录方法的地方吗?
  • @dab - 基于文件的日志记录没有问题。但是,我正在考虑记录到事件日志。 stackoverflow.com/questions/1133355/…
  • 所以这是一个错误导致它,但没有抛出异常(我正在使用的编码不良的类)。感谢您的回答!
【解决方案2】:

问题很可能是 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

【讨论】:

  • 啊哈,我没想到。我会试试看。
  • 这似乎不是确切的问题,结果是我使用的 OSInfo 类导致了一些错误。是时候研究它并弄清楚它发生了什么以及为什么它没有抛出错误! :P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多