2009-12-10 3 views
0

J'ai un winform de base, appelant un programme externe (SVN). Je veux afficher la sortie produite par SVN dans une zone de texte dans le formulaire.Actualiser les contrôles de formulaire avec sortie de programme externe

Voici mon code pour appeler ce programme externe:

private void SVNcmd(string args, string workingcopy) 
{ 
    textBoxOutput.Text += workingcopy + Environment.NewLine 
     + args + Environment.NewLine; 
    Process p = new Process(); 
    p.StartInfo.WorkingDirectory = workingcopy; 
    p.StartInfo.FileName = "svn"; 
    p.StartInfo.Arguments = args; 
    p.StartInfo.CreateNoWindow = true; 
    p.StartInfo.RedirectStandardOutput = true; 
    p.StartInfo.UseShellExecute = false; 
    p.Start(); 
    textBoxOutput.Text += p.StandardOutput.ReadToEnd() + Environment.NewLine; 
    p.WaitForExit(); 
} 

Il est appelé dans un "foreach". Le problème est que lorsque je lance la commande, je dois attendre que chaque commande soit terminée ... et cela peut prendre un certain temps. Pendant ce temps, le formulaire se fige et rien n'est affiché dans la zone de texte.
Peut-être qu'avec cette méthode les commandes sont lancées en même temps, malgré le WaitForExit? Je ne suis pas sûr, je ne suis pas familier avec ce type de problèmes (je suis plus d'un développeur web).

Que puis-je faire pour afficher la sortie SVN et arrêter le gel du formulaire pendant l'exécution du programme?

Merci

Répondre

1

Utilisez un arrière-plan pour cela. Dans le backgroundworder, vous pouvez signaler les progrès et les résultats à l'interface utilisateur.

Bon exemple sur MSDN

Laissez-vous travailleur DoWork faire votre code. Où vous obtenez lire les lignes, vous devriez faire worker.ReportProgress. Inscrivez-vous sur cet événement et récupérez la ligne depuis le param (l'événement).

+0

Merci, mais comment faire? – thomasb

1

Vous pouvez utiliser Process.BeginOutputReadLine() et BeginErrorReadLine() pour maintenir votre interface utilisateur à jour pendant l'exécution du programme. Il existe un bon exemple dans la rubrique de bibliothèque MSDN pour ces méthodes. Prenez garde que le callback s'exécute sur un thread, vous devez utiliser la méthode BeginInvoke du formulaire pour marshaler un appel au thread UI et mettre à jour le contrôle. Utilisez l'événement Process.Exited au lieu de WaitForExit() pour détecter l'achèvement du programme.

Cette approche évite également un blocage que vous obtiendrez lorsque le programme écrira trop de sortie pour tenir dans le tampon de sortie de la console, généralement autour de 2K.

Questions connexes