.net - 在 VB.NET 4 下创建系统服务时出现线程/定时器问题

标签 .net vb.net multithreading service cron

我认为在 VB .NET 下创建一个简单的系统服务将是小菜一碟。男孩,我错了吗。首先,我通过 Google 发现一般帖子说您应该使用 Windows.Forms.Timer。然后,我发现相互矛盾的信息表明您必须通过代码从计时器类派生计时器才能使其工作。然后,人们使用各种可用的线程报告各种问题。由于显而易见的原因,我无法使用 VS 2010 即时调试器调试线程(尽管我不知道是否有其他方法可以做到这一点)。哇,当没有明确的指南时,这一切是多么令人困惑……

我的项目是一个应用程序启动器(类似于 cron),它将在一定秒数内定期启动。我正在尝试使用 Process.Start() 方法。我有一个 Beep() 函数作为第一条指令,Process.Start 以及一个 Process.WaitForExit 方法使它作为最后一条指令阻塞。我让我的代码通过计时器来执行此操作,但现在我开始使用线程。执行上没有区别。被覆盖的 OnStart 方法确实启动了(正如我通过调试确定的那样),但是在生产中启动服务时什么都没有发生,就好像它忽略了我的所有代码一样。将循环和逻辑放在 OnStart 方法中会产生一个不会启动的进程。我知道这是一个线程问题,但我也知道必须强制使用线程。我现在对如何完成这项工作感到目瞪口呆。我很想知道解决方案。

除了服务类之外,我还实现了从 MSDN 逐字复制的 ServiceInstaller 和 ProcessInstaller。

这是我正在尝试使用的一些代码。请注意,这仅反射(reflect)了我的代码在尝试在线程而不是计时器中实现逻辑时的当前状态(这对我来说是最佳的):

    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。

最佳答案

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

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

另一个提示:所有处理代码为 普通应用 您可以轻松调试,一旦所有错误都被解决并且您知道代码完美无缺,那么 将其实现为服务 .

关于.net - 在 VB.NET 4 下创建系统服务时出现线程/定时器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10034359/

相关文章:

python - 如何正确使用 SyncManager.Lock 或 Event?

java - "synchronization with main memory"是什么意思?

c# - 缓存来自 [n async] 工厂方法的结果,前提是它不抛出

.net - 内部连接以获取不在表中的那些

vb.net - T4MVC 可以在 VB.NET 中工作吗?

.net - 使用 VB.NET 从 KML 中提取多边形名称和坐标

mysql - 我收到 auto _Suggest 错误,错误为 "Object reference not set an instance of an object "

c# - iTextSharp HTMLWorker.ParseToList() 抛出 NullReferenceException

.net - 限制 .NET 中多字节字符的 URL 编码字符串的长度

带有动态优先级标志的java队列