2016-10-26 113 views
1

我有一個小的控制檯應用程序,我想在C#中讀取輸出。因此我創建了這段代碼片段。命令提示符打開,但不顯示任何內容。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(); 

如果我刪除UseShellExecuteRedirectStandardOutput最後一行,在命令提示符下打開並顯示在Test.exe,但我需要的輸出字符串,所以我不得不使用這些屬性來讀取StandardOutput

我也嘗試設置2秒的超時(process.WaitForExit(2000)),但空的命令提示符在2秒後沒有關閉。

如果我在調試模式下手動關閉空命令提示符,那麼變量strOutput會提供我所需的信息。

回答

1

爲避免死鎖,您必須在等待退出之前先讀取輸出流。所以請嘗試:

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();