2012-04-23 7 views
1

を使用してアプリケーションをハングします。アプリケーションコードは次のとおりです。いくつかの時間p.StandardOutput.ReadLine();正常に動作しますが、呼ばれるプログラムは、常に1つの行を出力した場合、いくつかの時間は、それはあなたのプログラムが正しいことを私にStandardOutput.ReadLine()は、C#

+0

どのようなエラーが表示されますか? – Arion

+2

はおそらく、プログラムは時々何も出力しませんか? – CodesInChaos

+0

また、複数の行を出力することはありますか?その場合、出力バッファがいっぱいになると呼び出されたプログラムはブロックされます。最初の行の後で読むことは決してないので、それは永遠にブロックされるので、 'WaitForExit()'は返りません。呼ばれるプログラムが常に劣らず、これ以上、正確に1行を出力しない限り、つまり、あなたのプログラムは、間違っていません。 – CodesInChaos

答えて

2

を助けてください、私はすべてのものを試してみましたハングアップが、それでもこのエラー

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

を取得し、その行が短く、システムによって使用されるバッファよりも大きい。

出力されない場合、ReadLineは返されません。この場合、あなたのプログラムは壊れています。

、それはあまりにも多くを出力した場合は、出力バッファがフル稼働し、誰かが出力から十分に読み取るまでと呼ばれるプログラムは、そのWrite呼び出しでブロックされます。あなたが最初の行を超えた出力バッファから読んだことがないので、このブロックは永遠に続くだろうし、したがってと呼ばれるプログラムが終了することはありません。これにより、プログラムはデッドロックの原因になりますp.WaitForExit()

documentationは明確に述べている:

はそのリダイレクトストリームの最後に読む前に終了した子プロセスを待ちません。

コード例では、p.WaitForExitの前にp.StandardOutput.ReadToEndを呼び出してデッドロック状態を回避しています。デッドロック状態は、親プロセスがp.StandardOutput.ReadToEndより前にp.WaitForExitを呼び出し、子プロセスがリダイレクトされたストリームを満たすのに十分なテキストを書き込む場合に発生します。親プロセスは、子プロセスが終了するまで無期限に待機します。子プロセスは、無期限に親が完全なStandardOutputストリームから読み取るのを待機します。