3

我认为在 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。

4

2 回答 2

1

尝试转到服务控制面板,编辑服务的属性,然后选中“交互式服务”或“允许服务与桌面交互”选项。如果您尝试启动一个新进程并在屏幕上看到它,除非启用此选项,否则不会发生任何事情。

此外,将服务的登录凭据设置为管理员,以确保它不是权限问题。如果它有效,那么您已经发现了问题所在。

另一个提示:将所有处理代码编写为您可以轻松调试的普通应用程序,一旦所有错误都被消除并且您知道代码完美无缺,然后将其实现为服务

于 2012-04-05T19:57:52.383 回答
0

好的,我设法找到了我的项目无法正常工作的原因。我确实记得看到有人说 [STAThread] 指令对于已启动的进程在服务中执行是必需的,并且它必须放在 Main 函数之前。Codeproject 已经为 C# 中的 Windows 服务发布了一个cron 项目,它使用了这个指令。我将不得不更多地查看这个已发布的项目,但它可能无法在 VB .NET 中实现。在这一点上,我不明白如何通过 VB .NET Visual Studio 服务模板通过 Main 函数/类合并服务启动器,因为它似乎已经自行启动。

此外,我终于设法找到了一个 Windows cron 服务程序,它可以在几秒钟内运行,它没有强制性的商业许可,可以免费使用,并且注册成本低廉(根据网站上的说明)。它被称为WinCron

于 2012-04-06T17:49:57.323 回答