2016-10-26 2 views
1

Ich habe eine kleine Konsole Anwendung, und ich möchte die Ausgabe in C# lesen. Deshalb habe ich dieses Code-Snippet erstellt. Die Eingabeaufforderung wird geöffnet, aber nichts wird angezeigt.Deadlock in System.Diagnostic.Process

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal; 
process.StartInfo.FileName = DirectoryPath + "Test.exe"; 
process.StartInfo.Arguments = "-showAll"; 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true; 
process.Start(); 
process.WaitForExit(2000); 
String strOutput = process.StandardOutput.ReadToEnd(); 

Wenn I UseShellExecute, RedirectStandardOutput und die letzte Zeile zu entfernen, öffnet die Eingabeaufforderung und die Test.exe gezeigt, aber ich brauche die Ausgabe als Streich- und so habe ich diese Attribute verwenden, um die StandardOutput

zu lesen,

Ich habe auch versucht, ein Timeout von 2 Sekunden (process.WaitForExit(2000)) zu setzen, aber die leere Eingabeaufforderung wird nicht nach 2 Sekunden geschlossen.

Wenn ich die leere Eingabeaufforderung im Debug-Modus manuell schließe, hat die Variable strOutput meine angeforderten Informationen.

Antwort

1

Um Deadlocks zu vermeiden, müssen Sie den Ausgabestrom lesen, bevor Sie mit dem Beenden warten. Versuchen Sie also:

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
    process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal; 
    process.StartInfo.FileName = DirectoryPath + "Test.exe"; 
    process.StartInfo.Arguments = "-showAll"; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.Start(); 
    String strOutput = process.StandardOutput.ReadToEnd(); 
    process.WaitForExit();