2008-11-14 5 views
3

Je rencontre un problème avec une application administrative sur laquelle je travaille. Je construis une interface pour arrêter, démarrer et interroger divers services sur une quarantaine de serveurs. Je regarde service.controller et j'ai réussi à arrêter et démarrer divers services avec des événements de bouton mais maintenant j'essaye de trouver un moyen de retourner l'état de service à une zone de texte et demander l'état de service toutes les 10 secondes environ et j'ai l'impression de frapper un mur de briques.Service.Controller Status/Polling

Est-ce que quelqu'un a des conseils ou un aperçu?

Merci!

Répondre

4

Vous pouvez déclencher la vérification du service périodique à l'aide d'un objet Minuteur. Vous pouvez exécuter vos requêtes de service sur l'événement Elapsed.

private void t_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     // Check service statuses 
    } 

Comme pour afficher les états dans une zone de texte, vous devriez être en mesure d'utiliser la méthode ToString() sur l'état de service et afficher que dans une zone de texte ordinaire. Rappelez-vous que vous pouvez ou ne pouvez pas être sur le fil de l'interface graphique lorsque vous réagissez aux événements de minuterie, vous devez donc vous appeler sur le thread principal.

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 
     } 
    } 
2

Peut-être que vous ne voulez pas du sondage:

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 

Vive Evolved