1

以下はアプリケーションコードです。しばらく p.StandardOutput.ReadLine(); 正常に動作しますが、ハングアップすることがあります。すべてのことを試しましたが、まだこのエラーが発生します

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

私を助けてください

4

1 に答える 1

2

呼び出されたプログラムが常に正確に1行を出力し、その行がシステムで使用されるバッファーよりも短い場合、プログラムは正しいです。

行を出力しない場合は、ReadLine戻りません。したがって、この場合、プログラムは壊れています。

出力が多すぎると、出力バッファがいっぱいになり、Write誰かが出力から十分に読み取るまで、呼び出されたプログラムはその呼び出しをブロックします。最初の行を超えて出力バッファから読み取ることはないため、このブロックは永久に存続し、呼び出されたプログラムは終了しません。これにより、プログラムはでデッドロックしp.WaitForExit()ます。

ドキュメントには次のように明確に記載されています。

リダイレクトされたストリームの最後まで読み取る前に、子プロセスが終了するのを待たないでください。

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

于 2012-04-23T11:33:52.543 に答える