我认为在 VB .NET 下创建一个简单的系统服务将是小菜一碟。男孩,我错了吗。首先,我通过 Google 发现一般帖子说您应该使用 Windows.Forms.Timer。然后,我发现相互矛盾的信息表明您必须通过代码从计时器类派生计时器才能使其工作。然后,人们使用各种可用的线程报告各种问题。由于显而易见的原因,我无法使用 VS 2010 即时调试器调试线程(尽管我不知道是否有其他方法可以做到这一点)。哇,当没有明确的指南时,这一切是多么令人困惑……
我的项目是一个应用程序启动器(类似于 cron),它将在一定秒数内定期启动。我正在尝试使用 Process.Start() 方法。我有一个 Beep() 函数作为第一条指令,Process.Start 以及一个 Process.WaitForExit 方法使它作为最后一条指令阻塞。我让我的代码通过计时器来执行此操作,但现在我开始使用线程。执行上没有区别。被覆盖的 OnStart 方法确实启动了(正如我通过调试确定的那样),但是在生产中启动服务时什么也没有发生,就好像它忽略了我的所有代码一样。将循环和逻辑放在 OnStart 方法中会产生一个不会启动的进程。我知道这是一个线程问题,但我也知道必须强制使用线程。我现在对如何完成这项工作感到目瞪口呆。
除了服务类之外,我还实现了从 MSDN 逐字复制的 ServiceInstaller 和 ProcessInstaller。
这是我正在尝试使用的一些代码。请注意,这仅反映了我的代码在尝试在线程而不是计时器中实现逻辑时的当前状态(这对我来说是最佳的):
Dim config As String
Dim configValues(2) As String
Dim objReader As System.IO.StreamReader
Dim interval As Integer
Dim launchProcess As Process
While True
Beep()
' This sub runs every time the elapsed milli-seconds of the timer pass
' Sp add your code here.
config = "30 c:\WiFiDropOutFix\start.vbs"
Try
objReader = New System.IO.StreamReader("C:\WiFiDropOutFix\config.txt")
config = objReader.ReadToEnd
objReader.Close()
Catch ex As Exception
End Try
configValues = config.Split(New Char() {" "c})
interval = Convert.ToInt32(configValues(0))
If Not interval > 0 And Not interval < 61 Then
interval = 10
End If
launchProcess = Process.Start(configValues(1))
launchProcess.WaitForExit()
Thread.Sleep(interval * 1000)
End While
End Sub
这是我请求的 OnStart 代码:
Protected Overrides Sub OnStart(ByVal args() As String)
appLaunchLogicThread = New Thread(AddressOf appLaunchLogic)
appLaunchLogicThread.Start()
End Sub
TIA。