C# 服务控制器状态/轮询

C# 服务控制器状态/轮询,c#,windows,visual-studio,winapi,C#,Windows,Visual Studio,Winapi,我正在使用的一个管理应用程序有问题。我正在构建一个界面,用于在大约40台服务器上停止、启动和查询各种服务 我正在查看service.controller,并且已经成功地通过按钮事件停止和启动了各种服务,但现在我正试图找到一种方法,将服务状态返回到文本框,并每隔10秒左右查询一次服务状态,我感觉自己就像撞到了砖墙一样 有人有什么建议或见解吗 谢谢 您可以使用计时器对象触发定期服务检查。您可以对经过的事件运行服务查询 private void t_Elapsed(object sender,

我正在使用的一个管理应用程序有问题。我正在构建一个界面,用于在大约40台服务器上停止、启动和查询各种服务

我正在查看service.controller,并且已经成功地通过按钮事件停止和启动了各种服务,但现在我正试图找到一种方法,将服务状态返回到文本框,并每隔10秒左右查询一次服务状态,我感觉自己就像撞到了砖墙一样

有人有什么建议或见解吗


谢谢

您可以使用计时器对象触发定期服务检查。您可以对经过的事件运行服务查询

    private void t_Elapsed(object sender, ElapsedEventArgs e)
    {
        // Check service statuses
    }
至于在文本框中显示状态,您应该能够对服务状态使用ToString()方法,并将其显示在常规文本框中。请记住,在响应计时器事件时,您可能在GUI线程上,也可能不在GUI线程上,因此您需要在主线程上调用自己

    private delegate void TextUpdateHandler(string updatedText);

    private void UpdateServerStatuses(string statuses)
    {
        if (this.InvokeRequired)
        {
            TextUpdateHandler update = new TextUpdateHandler(this.UpdateServerStatuses);
            this.BeginInvoke(update, statuses);
        }
        else
        {
            // load textbox here
        }
    }

也许你不想投票:

Private serviceController As ServiceController = Nothing 
Private serviceControllerStatusRunning = False

Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    Try
        serviceController = New ServiceController("NameOfTheTheServiceYouWant")
        If serviceController.Status = ServiceControllerStatus.Stopped Then
            ' put code for stopped status here
        Else
            ' put code for running status here
        End If
        BackgroundWorker1.RunWorkerAsync()
    Catch ex As Exception
        MessageBox.Show("error:" + ex.Message)
        serviceController = Nothing
        Me.Close()
        Exit Sub
    End Try
End Sub

Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    If serviceControllerStatusRunning Then
        serviceController.WaitForStatus(ServiceControllerStatus.Stopped)
        serviceControllerStatusRunning = False
    Else
        serviceController.WaitForStatus(ServiceControllerStatus.Running)
        serviceControllerStatusRunning = True
    End If
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
     if serviceControllerStatusRunning then
       ' put code for running status here
     else
       ' put code for stopped status here
     end if
     BackgroundWorker1.RunWorkerAsync() ' start worker thread again
End Sub
干杯 进化