2010-11-15 7 views
0

J'ai le problème suivant et j'espère que quelqu'un pourra m'aider avec.Annulation de background-worker

J'ai un travailleur dans VB .net (2010) qui exécute un programme shell.

Le programme shell est un service et d'autres choses comme la sortie:

Server initializing... 
Server opening port... 
more info... 

Je suis en mesure de « attraper » la sortie de la coquille et l'ajouter à une zone de texte (en utilisant la fonction de texte défini).

Et je suis en mesure d'annuler le travailleur en cliquant sur un bouton d'arrêt, mais quand il n'y a plus de sortie par le shell, je ne peux plus arrêter le travailleur.

Au moins, je pense que c'est le cas.

J'ai essayé de vérifier pour endofstream (section commentée) mais cela ne fonctionne pas.

J'ai également essayé de faire du même code avec du texte de test au lieu de 'clsProcess.StandardOutput.ReadLine' et cela fonctionne également.

Donc je suis arrivé à la conclusion qu'il doit avoir quelque chose à voir avec clsProcess.StandardOutput.ReadLine étant à la fin ???

Try 
     clsProcess.StartInfo.UseShellExecute = False 
     clsProcess.StartInfo.RedirectStandardOutput = True 
     clsProcess.StartInfo.RedirectStandardError = True 
     clsProcess.StartInfo.FileName = serverpath + config_executable 
     clsProcess.StartInfo.CreateNoWindow = True 
     clsProcess.Start() 
    Catch ex As Exception 
     MsgBox(ex.Message, MsgBoxStyle.Critical, "Error starting server") 
     Debug.Print(ex.Message) 
    End Try 

    Do While Not workerServer.CancellationPending 
     Try 
      'If Not clsProcess.StandardOutput.EndOfStream Then 
      SetText(clsProcess.StandardOutput.ReadLine + vbNewLine) 
      'End If 
     Catch ex As Exception 
      MsgBox(ex.Message, MsgBoxStyle.Critical, "Error adding line to log") 
     End Try 

     Threading.Thread.Sleep(100) 
    Loop 

    clsProcess.Kill() 

Des idées?

Merci d'avance!

Cordialement,

PH

+0

Pouvez-vous publier le code dans l'événement click de votre bouton d'arrêt? Et toutes les fonctions pertinentes que le code peut appeler? – overslacked

Répondre

2

On peut supposer que ce qui se passe sur un autre thread. Essayez le processus Kill() depuis le thread graphique au lieu de simplement définir CancellationPending. Vous avez raison que l'appel ReadLine() bloque, ce qui fait que la boucle while ne réévalue jamais sa condition une fois qu'il n'y a plus de sortie.

Le retrait du processus d'un autre thread devrait fonctionner. (Il peut lancer une exception de ReadLine(), alors préparez-vous à cela.)

+0

OMG Vous rock! Merci mon pote. Si simple. *la honte*. Je pensais que le processus n'était pas accessible dans le fil de l'interface graphique! Merci encore. – PeeHaa

+0

Pas de problème. S'il vous plaît, n'oubliez pas d'accepter cette réponse si cela vous a été utile. :) – cdhowie

+0

Terminé. Je voulais vous voter, mais je ne pouvais pas (pas de représentant). Rappelez-vous juste que je voulais vous voter pour ce que ça vaut :) – PeeHaa