2011-06-21 3 views
2

En utilisant le ProcessStartInfo et Process Je voudrais démarrer un programme (par exemple getdiff.exe) et ensuite lire toute la sortie que le programme produit. Plus tard, je vais utiliser les données d'une manière plus constructive mis en ce moment je veux juste imprimer les données pour s'assurer que cela fonctionne. Cependant, le programme ne se termine pas comme il se doit. Est-ce que quelqu'un se voit pourquoi? Merci d'avance.Le programme ne se termine pas lors de l'utilisation des processus

ProcessStartInfo psi = new ProcessStartInfo("getdiff.exe"); 
psi.Arguments = "DIFF"; 
psi.UseShellExecute = false;     
psi.RedirectStandardInput = true; 
psi.WorkingDirectory = "c:\\test"; 

Process p = Process.Start(psi); 
string read = p.StandardOutput.ReadToEnd(); 
p.WaitForExit(); 

Console.WriteLine(p); 
Console.WriteLine("Complete"); 

p.Close(); 

Modification du programme à ce qu'il fonctionne correctement obtenu:

ProcessStartInfo psi = new ProcessStartInfo("getdiff.exe"); 
psi.Arguments = "DIFF"; 
psi.UseShellExecute = false;     
psi.RedirectStandardInput = true; 
psi.WorkingDirectory = "c:\\test"; 

Process p = Process.Start(psi); 
StreamReader read = p.StandardOutput; 

while (read.Peek() >= 0) 
    Console.WriteLine(read.ReadLine()); 

Console.WriteLine("Complete"); 
p.WaitForExit(); 
p.Close(); 
+0

Quelle partie de celui-ci ne soit pas fin à comme il se doit? Votre application ou le processus appelé? – Jaymz

+0

Pourquoi devrait-il se terminer? Est-ce une application console? Autre chose? –

+0

Ceci est une fonction dans un programme plus important. Mais lors de l'exécution de ce seul, le programme ne se termine jamais. Donc ce n'est pas sain. – Teletha

Répondre

2
ProcessStartInfo psi = new ProcessStartInfo("getdiff.exe"); 
psi.Arguments = "DIFF"; 
psi.UseShellExecute = false;     
psi.RedirectStandardInput = true; 
psi.WorkingDirectory = "c:\\test"; 

Process p = Process.Start(psi); 
StreamReader read = p.StandardOutput; 

while (read.Peek() >= 0) 
    Console.WriteLine(read.ReadLine()); 

Console.WriteLine("Complete"); 
p.WaitForExit(); 
p.Close(); 
1

Je ne sais pas si elle est liée, mais vous psi.RedirectStandardInput = true; sans faire quelque chose avec le flux résultant. Peut-être, en quelque sorte, l'application exige que le flux d'entrée est "fermé" avant de sortir? Essayez donc myProcess.StandardInput.Close().

+0

J'ai aussi vu ça. Et 'psi.RedirectStandardOutput = true;' termine le programme. La sortie est étrange mais elle se termine. – Teletha

3

The MSDN provides a good example comment une entrée/sortie de processus peut être redirigée. ReadToEnd() ne peut pas déterminer correctement la fin du flux. Le MSDN says:

ReadToEnd suppose que le flux sait quand il a atteint une fin. Pour les protocoles interactifs, dans lesquels le serveur envoie des données uniquement lorsque vous le demandez et ne ferme pas la connexion, ReadToEnd peut bloquer indéfiniment et doit être évité.

EDIT: Une autre raison d'éviter ReadToEnd(): Un processus très rapide provoque une exception, car le flux doit être redirigée avant que la sortie du programme de données.

0

Essayez ce code à la place,

p.CloseMainWindow()

Questions connexes