所以我在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
谢谢你的时间!
答案 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并以最小的方式记录意外异常是很好的环绕代码,具有最少的依赖性(例如,事件日志)。