2012-04-23 284 views
1

以下是應用程序代碼。一段時間p.StandardOutput.ReadLine();工作正常,但過一段時間就掛斷我嘗試了所有的事情,但仍然收到此錯誤StandardOutput.ReadLine()應用程序掛起使用C#

ProcessStartInfo startInfo = new ProcessStartInfo("c:\\windows\\system32\\test.exe"); 
String s = " "; 

startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
startInfo.CreateNoWindow = true; 
startInfo.RedirectStandardInput = true; 
startInfo.RedirectStandardOutput = true; 
startInfo.UseShellExecute = false; 
Process p = Process.Start(startInfo); 
p.StandardInput.WriteLine("list volume\n"); 
String f = ""; 
bool ignoredHeader = false; 

s = p.StandardOutput.ReadLine(); 
p.WaitForExit(); 

請幫我

+0

你什麼錯誤? – Arion 2012-04-23 11:24:56

+2

也許程序有時不輸出任何東西? – CodesInChaos 2012-04-23 11:26:53

+0

或者它有時輸出多於一行?在這種情況下,一旦輸出緩衝區滿了,被調用的程序就會被阻塞。而且,因爲在第一行之後你永遠不會讀它,它將永遠阻塞,因此'WaitForExit()'不會返回。總之,你的程序是錯誤的,除非被調用的程序總是輸出一行,不多不少。 – CodesInChaos 2012-04-23 11:27:55

回答

2

你的程序是正確的,如果被調用的程序總是輸出只有一個行,該行是短比系統採用的緩衝區大。

如果沒有輸出線,ReadLine將不會返回。所以你的程序在這種情況下被打破。

如果輸出過多,輸出緩衝區滿運行,並且被調用的程序將阻止其Write電話,直到有人讀取輸出不夠。由於你從不讀第一行之外的輸出緩衝區,這個塊將永遠持續下去,因此被調用的程序永遠不會終止。這反過來導致您的程序在p.WaitForExit()處於死鎖狀態。

documentation明確指出:

不要等到子進程讀取其重定向流的末尾之前退出。

該代碼例如通過p.WaitForExit之前調用p.StandardOutput.ReadToEnd避免了死鎖條件。如果父進程在p.StandardOutput.ReadToEnd之前調用p.WaitForExit,並且子進程寫入足夠的文本以填充重定向的流,則可能會導致死鎖情況。父進程將無限期地等待子進程退出。子進程將無限期地等待父進程從完整的StandardOutput流中讀取。